KiCad PCB EDA Suite
SELECTION_TOOL Class Reference

Class SELECTION_TOOL. More...

#include <selection_tool.h>

Inheritance diagram for SELECTION_TOOL:
PCB_TOOL TOOL_INTERACTIVE TOOL_BASE

Classes

class  PRIV
 Private implementation of firewalled private data. More...
 

Public Types

enum  RESET_REASON { RUN, MODEL_RELOAD, GAL_SWITCH }
 

Determines the reason of reset for a tool

More...
 

Public Member Functions

 SELECTION_TOOL ()
 
 ~SELECTION_TOOL ()
 
bool Init () override
 Function Init() Init() is called once upon a registration of the tool. More...
 
void Reset (RESET_REASON aReason) override
 Function Reset() Brings the tool to a known, initial state. More...
 
int Main (const TOOL_EVENT &aEvent)
 Function Main() More...
 
SELECTIONGetSelection ()
 Function GetSelection() More...
 
SELECTIONRequestSelection (int aFlags=SELECTION_DEFAULT)
 Function RequestSelection() More...
 
TOOL_MENUGetToolMenu ()
 
SELECTION_LOCK_FLAGS CheckLock ()
 

Checks if the user has agreed to modify locked items for the given selection.

More...
 
int CursorSelection (const TOOL_EVENT &aEvent)
 

Select a single item under cursor event handler.

More...
 
int ClearSelection (const TOOL_EVENT &aEvent)
 

Clear current selection event handler.

More...
 
bool SanitizeSelection ()
 

Makes sure a group selection does not contain items that would cause conflicts when moving/rotating together (e.g.

More...
 
int SelectItem (const TOOL_EVENT &aEvent)
 

Item selection event handler.

More...
 
int SelectItems (const TOOL_EVENT &aEvent)
 

Multiple item selection event handler

More...
 
int UnselectItem (const TOOL_EVENT &aEvent)
 

Item unselection event handler.

More...
 
int UnselectItems (const TOOL_EVENT &aEvent)
 

Multiple item unselection event handler

More...
 
void SetTransitions () override
 

Sets up handlers for various events.

More...
 
void zoomFitSelection (void)
 

Zooms the screen to center and fit the current selection.

More...
 
void SetEditModules (bool aEnabled)
 Function SetEditModules() More...
 
bool EditingModules () const
 
void Activate ()
 Function Activate() Runs the tool. More...
 
void SetContextMenu (CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger=CMENU_BUTTON)
 Function SetContextMenu() More...
 
void RunMainStack (std::function< void()> aFunc)
 Function RunMainStack() More...
 
template<class T >
void Go (int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
 Function Go() More...
 
OPT_TOOL_EVENT Wait (const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
 Function Wait() More...
 
TOOL_TYPE GetType () const
 Function GetType() Returns the type of the tool. More...
 
TOOL_ID GetId () const
 Function GetId() Returns the unique identifier of the tool. More...
 
const std::string & GetName () const
 Function GetName() Returns the name of the tool. More...
 
TOOL_MANAGERGetManager () const
 Function GetManager() Returns the instance of TOOL_MANAGER that takes care of the tool. More...
 
TOOL_SETTINGSGetSettings ()
 

Static Public Attributes

static const TOOL_EVENT SelectedEvent
 

Event sent after an item is selected.

More...
 
static const TOOL_EVENT UnselectedEvent
 

Event sent after an item is unselected.

More...
 
static const TOOL_EVENT ClearedEvent
 

Event sent after selection is cleared.

More...
 

Protected Types

enum  INTERACTIVE_PLACEMENT_OPTIONS {
  IPO_ROTATE = 1, IPO_FLIP = 2, IPO_PROPERTIES = 4, IPO_SINGLE_CLICK = 8,
  IPO_REPEAT = 16
}
 

Protected Member Functions

void doInteractiveItemPlacement (INTERACTIVE_PLACER_BASE *aPlacer, const wxString &aCommitMessage, int aOptions=IPO_ROTATE|IPO_FLIP|IPO_REPEAT)
 Helper function for performing a common interactive idiom: wait for a left click, place an item there (perhaps with a dialog or other user interaction), then have it move with the mouse and respond to rotate/flip, etc. More...
 
KIGFX::VIEWview () const
 
KIGFX::VIEW_CONTROLScontrols () const
 
PCB_EDIT_FRAMEframe () const
 
BOARDboard () const
 
const TOOL_EVENT evActivate (std::string aToolName="")
 functions below are not yet implemented - their interface may change More...
 
const TOOL_EVENT evCommand (int aCommandId=-1)
 
const TOOL_EVENT evCommand (std::string aCommandStr="")
 
const TOOL_EVENT evMotion ()
 
const TOOL_EVENT evClick (int aButton=BUT_ANY)
 
const TOOL_EVENT evDrag (int aButton=BUT_ANY)
 
const TOOL_EVENT evButtonUp (int aButton=BUT_ANY)
 
const TOOL_EVENT evButtonDown (int aButton=BUT_ANY)
 
void attachManager (TOOL_MANAGER *aManager)
 Function attachManager() More...
 
KIGFX::VIEWgetView () const
 Function getView() More...
 
KIGFX::VIEW_CONTROLSgetViewControls () const
 Function getViewControls() More...
 
template<typename T >
T * getEditFrame () const
 Function getEditFrame() More...
 
template<typename T >
T * getModel () const
 Function getModel() More...
 

Protected Attributes

bool m_editModules
 
TOOL_TYPE m_type
 

Stores the type of the tool.

More...
 
TOOL_ID m_toolId
 

Unique identifier for the tool, assigned by a TOOL_MANAGER instance.

More...
 
std::string m_toolName
 

Name of the tool.

More...
 
TOOL_MANAGERm_toolMgr
 
TOOL_SETTINGS m_toolSettings
 

Private Member Functions

bool selectPoint (const VECTOR2I &aWhere, bool aOnDrag=false)
 Function selectPoint() Selects an item pointed by the parameter aWhere. More...
 
bool selectCursor (bool aSelectAlways=false)
 Function selectCursor() Selects an item under the cursor unless there is something already selected or aSelectAlways is true. More...
 
bool selectMultiple ()
 Function selectMultiple() Handles drawing a selection box that allows to select many items at the same time. More...
 
int selectConnection (const TOOL_EVENT &aEvent)
 

Selects a trivial connection (between two junctions) of items in selection

More...
 
int selectCopper (const TOOL_EVENT &aEvent)
 

Selects items with a continuous copper connection to items in selection

More...
 
int selectNet (const TOOL_EVENT &aEvent)
 Selects all copper connections belonging to the same net(s) as the items in the selection. More...
 
void selectAllItemsConnectedToTrack (TRACK &aSourceTrack)
 Selects all items connected by copper tracks to the given TRACK. More...
 
void selectAllItemsConnectedToItem (BOARD_CONNECTED_ITEM &aSourceItem)
 Selects all items connected (by copper) to the given item. More...
 
void selectAllItemsOnNet (int aNetCode)
 Selects all items with the given net code. More...
 
void selectAllItemsOnSheet (wxString &aSheetpath)
 Selects all items with the given sheet timestamp name (the sheet path) More...
 
int selectOnSheetFromEeschema (const TOOL_EVENT &aEvent)
 

Selects all modules belonging to same sheet, from Eeschema, using crossprobing

More...
 
int selectSameSheet (const TOOL_EVENT &aEvent)
 

Selects all modules belonging to same hierarchical sheet as the selected footprint.

More...
 
void findCallback (BOARD_ITEM *aItem)
 

Find dialog callback.

More...
 
int find (const TOOL_EVENT &aEvent)
 

Find an item.

More...
 
int findMove (const TOOL_EVENT &aEvent)
 

Find an item and start moving.

More...
 
int filterSelection (const TOOL_EVENT &aEvent)
 

Invoke filter dialog and modify current selection

More...
 
void clearSelection ()
 Function clearSelection() Clears the current selection. More...
 
BOARD_ITEMdisambiguationMenu (GENERAL_COLLECTOR *aItems)
 Function disambiguationMenu() Handles the menu that allows to select one of many items in case there is more than one item at the selected point (. More...
 
BOARD_ITEMpickSmallestComponent (GENERAL_COLLECTOR *aCollector)
 Function pickSmallestComponent() Allows to find the smallest (in terms of bounding box area) item from the list. More...
 
void toggleSelection (BOARD_ITEM *aItem)
 Function toggleSelection() Changes selection status of a given item. More...
 
bool selectable (const BOARD_ITEM *aItem) const
 Function selectable() Checks conditions for an item to be selected. More...
 
bool modifiable (const BOARD_ITEM *aItem) const
 Function modifiable() Checks if an item might be modified. More...
 
void select (BOARD_ITEM *aItem)
 Function select() Takes necessary action mark an item as selected. More...
 
void unselect (BOARD_ITEM *aItem)
 Function unselect() Takes necessary action mark an item as unselected. More...
 
void selectVisually (BOARD_ITEM *aItem)
 Function selectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST. More...
 
void unselectVisually (BOARD_ITEM *aItem)
 Function unselectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST. More...
 
bool selectionContains (const VECTOR2I &aPoint) const
 Function selectionContains() Checks if the given point is placed within any of selected items' bounding box. More...
 
void guessSelectionCandidates (GENERAL_COLLECTOR &aCollector) const
 Function guessSelectionCandidates() Tries to guess best selection candidates in case multiple items are clicked, by doing some braindead heuristics. More...
 
int updateSelection (const TOOL_EVENT &aEvent)
 Event handler to update the selection VIEW_ITEM. More...
 

Private Attributes

PCB_BASE_FRAMEm_frame
 Pointer to the parent frame. More...
 
SELECTION m_selection
 Current state of selection. More...
 
bool m_additive
 Flag saying if items should be added to the current selection or rather replace it. More...
 
bool m_subtractive
 Flag saying if items should be removed from the current selection. More...
 
bool m_multiple
 Flag saying if multiple selection mode is active. More...
 
bool m_locked
 Can other tools modify locked items. More...
 
TOOL_MENU m_menu
 Menu model displayed by the tool. More...
 
std::unique_ptr< PRIVm_priv
 

Detailed Description

Class SELECTION_TOOL.

Our sample selection tool: currently supports:

  • pick single objects (click LMB)
  • add objects to existing selection (Shift+LMB)
  • draw selection box (drag LMB)
  • handles MODULEs properly (i.e. selects either MODULE or its PADs, TEXTs, etc.)
  • takes into account high-contrast & layer visibility settings
  • invokes InteractiveEdit tool when user starts to drag selected items

Definition at line 61 of file selection_tool.h.

Member Enumeration Documentation

enum PCB_TOOL::INTERACTIVE_PLACEMENT_OPTIONS
protectedinherited
Enumerator
IPO_ROTATE 
IPO_FLIP 
IPO_PROPERTIES 
IPO_SINGLE_CLICK 
IPO_REPEAT 

Definition at line 98 of file pcb_tool.h.

enum TOOL_BASE::RESET_REASON
inherited

Determines the reason of reset for a tool

Enumerator
RUN 

Tool is invoked after being inactive.

MODEL_RELOAD 

Model changes (required full reload)

GAL_SWITCH 

Rendering engine changes.

Definition at line 80 of file tool_base.h.

81  {
82  RUN,
83  MODEL_RELOAD,
84  GAL_SWITCH
85  };
Model changes (required full reload)
Definition: tool_base.h:83
Tool is invoked after being inactive.
Definition: tool_base.h:82
Rendering engine changes.
Definition: tool_base.h:84

Constructor & Destructor Documentation

SELECTION_TOOL::SELECTION_TOOL ( )

Definition at line 175 of file selection_tool.cpp.

175  :
176  PCB_TOOL( "pcbnew.InteractiveSelection" ),
177  m_frame( NULL ), m_additive( false ), m_subtractive( false ),
178  m_multiple( false ),
179  m_locked( true ), m_menu( *this ),
180  m_priv( std::make_unique<PRIV>() )
181 {
182 
183 }
std::unique_ptr< PRIV > m_priv
bool m_multiple
Flag saying if multiple selection mode is active.
bool m_additive
Flag saying if items should be added to the current selection or rather replace it.
PCB_TOOL(TOOL_ID aId, const std::string &aName)
Constructor.
Definition: pcb_tool.h:65
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
TOOL_MENU m_menu
Menu model displayed by the tool.
bool m_subtractive
Flag saying if items should be removed from the current selection.
bool m_locked
Can other tools modify locked items.
SELECTION_TOOL::~SELECTION_TOOL ( )

Definition at line 186 of file selection_tool.cpp.

References TOOL_BASE::getView(), m_selection, and KIGFX::VIEW::Remove().

187 {
188  getView()->Remove( &m_selection );
189 }
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
SELECTION m_selection
Current state of selection.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30

Member Function Documentation

void TOOL_INTERACTIVE::Activate ( )
inherited

Function Activate() Runs the tool.

After activation, the tool starts receiving events until it is finished.

Definition at line 49 of file tool_interactive.cpp.

References TOOL_MANAGER::InvokeTool(), TOOL_BASE::m_toolId, and TOOL_BASE::m_toolMgr.

Referenced by MODULE_EDITOR_TOOLS::CopyItems(), PCBNEW_CONTROL::DeleteItemCursor(), PCB_TOOL::doInteractiveItemPlacement(), ROUTER_TOOL::DpDimensionsDialog(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::drawZone(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), DRAWING_TOOL::PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), DRAWING_TOOL::SetAnchor(), ROUTER_TOOL::SettingsDialog(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

50 {
52 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
TOOL_ID m_toolId
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:215
bool InvokeTool(TOOL_ID aToolId)
Function InvokeTool() Calls a tool by sending a tool activation event to tool of given ID...
void TOOL_BASE::attachManager ( TOOL_MANAGER aManager)
protectedinherited

Function attachManager()

Sets the TOOL_MANAGER the tool will belong to. Called by TOOL_MANAGER::RegisterTool()

Definition at line 54 of file tool_base.cpp.

References TOOL_BASE::m_toolMgr, TOOL_BASE::m_toolSettings, and TOOL_BASE::TOOL_SETTINGS.

Referenced by TOOL_MANAGER::RegisterTool().

55 {
56  m_toolMgr = aManager;
57  m_toolSettings = TOOL_SETTINGS( this );
58 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:221
friend class TOOL_SETTINGS
Definition: tool_base.h:160
SELECTION_LOCK_FLAGS SELECTION_TOOL::CheckLock ( )

Checks if the user has agreed to modify locked items for the given selection.

Definition at line 614 of file selection_tool.cpp.

References IsOK(), PCB_TOOL::m_editModules, m_frame, m_locked, m_selection, PCB_MODULE_EDGE_T, PCB_MODULE_T, PCB_MODULE_TEXT_T, SELECTION_LOCK_OVERRIDE, SELECTION_LOCKED, and SELECTION_UNLOCKED.

Referenced by CursorSelection(), EDIT_TOOL::Flip(), EDIT_TOOL::Main(), EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Remove(), and EDIT_TOOL::Rotate().

615 {
616  if( !m_locked || m_editModules )
617  return SELECTION_UNLOCKED;
618 
619  bool containsLocked = false;
620 
621  // Check if the selection contains locked items
622  for( const auto& item : m_selection )
623  {
624  switch( item->Type() )
625  {
626  case PCB_MODULE_T:
627  if( static_cast<MODULE*>( item )->IsLocked() )
628  containsLocked = true;
629  break;
630 
631  case PCB_MODULE_EDGE_T:
632  case PCB_MODULE_TEXT_T:
633  if( static_cast<MODULE*>( item->GetParent() )->IsLocked() )
634  containsLocked = true;
635  break;
636 
637  default: // suppress warnings
638  break;
639  }
640  }
641 
642  if( containsLocked )
643  {
644  if( IsOK( m_frame, _( "Selection contains locked items. Do you want to continue?" ) ) )
645  {
646  m_locked = false;
648  }
649  else
650  return SELECTION_LOCKED;
651  }
652 
653  m_locked = false;
654 
655  return SELECTION_UNLOCKED;
656 }
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:106
class MODULE, a footprint
Definition: typeinfo.h:101
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
bool m_editModules
Definition: pcb_tool.h:128
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:105
bool m_locked
Can other tools modify locked items.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Function IsOK displays a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:111
int SELECTION_TOOL::ClearSelection ( const TOOL_EVENT aEvent)

Clear current selection event handler.

Definition at line 681 of file selection_tool.cpp.

References clearSelection().

Referenced by SetTransitions().

682 {
683  clearSelection();
684 
685  return 0;
686 }
void clearSelection()
Function clearSelection() Clears the current selection.
void SELECTION_TOOL::clearSelection ( )
private

Function clearSelection() Clears the current selection.

Definition at line 1225 of file selection_tool.cpp.

References ClearedEvent, SELECTION::Empty(), m_frame, m_locked, m_selection, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ProcessEvent(), PCB_BASE_FRAME::SetCurItem(), and unselectVisually().

Referenced by ClearSelection(), CursorSelection(), filterSelection(), findCallback(), findMove(), Main(), Reset(), selectCursor(), selectOnSheetFromEeschema(), selectPoint(), selectSameSheet(), and toggleSelection().

1226 {
1227  if( m_selection.Empty() )
1228  {
1229  return;
1230  }
1231 
1232  for( auto item : m_selection )
1233  {
1234  unselectVisually( static_cast<BOARD_ITEM*>( item ) );
1235  }
1236 
1237  m_selection.Clear();
1238 
1239  m_frame->SetCurItem( NULL );
1240  m_locked = true;
1241 
1242  // Inform other potentially interested tools
1244 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
void unselectVisually(BOARD_ITEM *aItem)
Function unselectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST.
static const TOOL_EVENT ClearedEvent
Event sent after selection is cleared.
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
bool m_locked
Can other tools modify locked items.
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
KIGFX::VIEW_CONTROLS* PCB_TOOL::controls ( ) const
inlineprotectedinherited
int SELECTION_TOOL::CursorSelection ( const TOOL_EVENT aEvent)

Select a single item under cursor event handler.

Definition at line 659 of file selection_tool.cpp.

References CheckLock(), clearSelection(), SELECTION::Empty(), m_selection, TOOL_EVENT::Parameter(), SanitizeSelection(), selectCursor(), and SELECTION_LOCKED.

Referenced by SetTransitions().

660 {
661  bool sanitize = (bool) aEvent.Parameter<intptr_t>();
662 
663  if( m_selection.Empty() ) // Try to find an item that could be modified
664  {
665  selectCursor( true );
666 
667  if( CheckLock() == SELECTION_LOCKED )
668  {
669  clearSelection();
670  return 0;
671  }
672  }
673 
674  if( sanitize )
676 
677  return 0;
678 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
bool SanitizeSelection()
Makes sure a group selection does not contain items that would cause conflicts when moving/rotating t...
BOARD_ITEM * SELECTION_TOOL::disambiguationMenu ( GENERAL_COLLECTOR aItems)
private

Function disambiguationMenu() Handles the menu that allows to select one of many items in case there is more than one item at the selected point (.

See also
selectCursor()).
Parameters
aItemscontains list of items that are displayed to the user.

Definition at line 1247 of file selection_tool.cpp.

References KIGFX::VIEW::Add(), CONTEXT_MENU::Add(), EDA_ITEM::ClearBrightened(), CMENU_NOW, CONTEXT_MENU::DisplayTitle(), KIGFX::GEOMETRY, COLLECTOR::GetCount(), EDA_ITEM::GetSelectMenuText(), TOOL_BASE::getView(), EDA_ITEM::IsBrightened(), KIGFX::VIEW::MarkTargetDirty(), min, KIGFX::VIEW::Remove(), EDA_ITEM::SetBrightened(), TOOL_INTERACTIVE::SetContextMenu(), BRIGHT_BOX::SetItem(), CONTEXT_MENU::SetTitle(), KIGFX::VIEW::SetVisible(), TA_CONTEXT_MENU_CHOICE, TA_CONTEXT_MENU_UPDATE, KIGFX::TARGET_OVERLAY, KIGFX::VIEW::Update(), and TOOL_INTERACTIVE::Wait().

Referenced by selectPoint().

1248 {
1249  BOARD_ITEM* current = NULL;
1250  PCB_BRIGHT_BOX brightBox;
1251  CONTEXT_MENU menu;
1252 
1253  getView()->Add( &brightBox );
1254 
1255  int limit = std::min( 10, aCollector->GetCount() );
1256 
1257  for( int i = 0; i < limit; ++i )
1258  {
1259  wxString text;
1260  BOARD_ITEM* item = ( *aCollector )[i];
1261  text = item->GetSelectMenuText();
1262  menu.Add( text, i + 1 );
1263  }
1264 
1265  menu.SetTitle( _( "Clarify selection" ) );
1266  menu.DisplayTitle( true );
1267  SetContextMenu( &menu, CMENU_NOW );
1268 
1269  while( OPT_TOOL_EVENT evt = Wait() )
1270  {
1271  if( evt->Action() == TA_CONTEXT_MENU_UPDATE )
1272  {
1273  if( current )
1274  current->ClearBrightened();
1275 
1276  int id = *evt->GetCommandId();
1277 
1278  // User has pointed an item, so show it in a different way
1279  if( id > 0 && id <= limit )
1280  {
1281  current = ( *aCollector )[id - 1];
1282  current->SetBrightened();
1283  }
1284  else
1285  {
1286  current = NULL;
1287  }
1288  }
1289  else if( evt->Action() == TA_CONTEXT_MENU_CHOICE )
1290  {
1291  boost::optional<int> id = evt->GetCommandId();
1292 
1293  // User has selected an item, so this one will be returned
1294  if( id && ( *id > 0 ) )
1295  current = ( *aCollector )[*id - 1];
1296  else
1297  current = NULL;
1298 
1299  break;
1300  }
1301 
1302  // Draw a mark to show which item is available to be selected
1303  if( current && current->IsBrightened() )
1304  {
1305  brightBox.SetItem( current );
1306  getView()->SetVisible( &brightBox, true );
1307 // getView()->Hide( &brightBox, false );
1308  getView()->Update( &brightBox, KIGFX::GEOMETRY );
1310  }
1311  }
1312 
1313  getView()->Remove( &brightBox );
1314 
1315 
1316  return current;
1317 }
bool IsBrightened() const
Definition: base_struct.h:224
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
Class CONTEXT_MENU.
Definition: context_menu.h:44
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
void SetBrightened()
Definition: base_struct.h:229
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
virtual wxString GetSelectMenuText() const
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
wxMenuItem * Add(const wxString &aLabel, int aId, const BITMAP_OPAQUE *aIcon=NULL)
Function Add() Adds an entry to the menu.
void ClearBrightened()
Definition: base_struct.h:233
void SetItem(EDA_ITEM *aItem)
Definition: bright_box.cpp:61
void MarkTargetDirty(int aTarget)
Function MarkTargetDirty() Sets or clears target 'dirty' flag.
Definition: view.h:576
void SetContextMenu(CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger=CMENU_BUTTON)
Function SetContextMenu()
Items that may change while the view stays the same (noncached)
Definition: definitions.h:43
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
Class PCB_BRIGHT_BOX.
void SetTitle(const wxString &aTitle) override
Function SetTitle() Sets title for the context menu.
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1331
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
void DisplayTitle(bool aDisplay=true)
Function DisplayTitle() Decides whether a title for a pop up menu should be displayed.
#define min(a, b)
Definition: auxiliary.h:85
Color has changed.
Definition: view_item.h:57
void PCB_TOOL::doInteractiveItemPlacement ( INTERACTIVE_PLACER_BASE aPlacer,
const wxString &  aCommitMessage,
int  aOptions = IPO_ROTATE | IPO_FLIP | IPO_REPEAT 
)
protectedinherited

Helper function for performing a common interactive idiom: wait for a left click, place an item there (perhaps with a dialog or other user interaction), then have it move with the mouse and respond to rotate/flip, etc.

More complex interactive processes are not supported here, you should implement a customised event loop for those.

Parameters
aItemCreatorthe callable that will attempt to create the item
aCommitMessagethe message used on a successful commit

Definition at line 38 of file pcb_tool.cpp.

References TOOL_INTERACTIVE::Activate(), KIGFX::VIEW_GROUP::Add(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), PCB_TOOL::board(), BUT_LEFT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), PCB_TOOL::controls(), INTERACTIVE_PLACER_BASE::CreateItem(), dyn_cast(), PCB_ACTIONS::flip, PCB_TOOL::frame(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_EVT_UTILS::GetEventRotationAngle(), TOOL_BASE::GetManager(), PCB_TOOL::IPO_FLIP, PCB_TOOL::IPO_REPEAT, PCB_TOOL::IPO_ROTATE, PCB_TOOL::IPO_SINGLE_CLICK, TOOL_EVT_UTILS::IsCancelInteractive(), TOOL_EVT_UTILS::IsRotateToolEvt(), INTERACTIVE_PLACER_BASE::m_board, INTERACTIVE_PLACER_BASE::m_frame, PCB_MODULE_T, INTERACTIVE_PLACER_BASE::PlaceItem(), BOARD_COMMIT::Push(), KIGFX::VIEW_GROUP::Remove(), SELECTION::Remove(), KIGFX::VIEW::Remove(), TOOL_MANAGER::RunAction(), MODULE::RunOnChildren(), PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), KIGFX::VIEW_CONTROLS::SetSnapping(), KIGFX::VIEW_CONTROLS::ShowCursor(), TC_COMMAND, KIGFX::VIEW::Update(), PCB_TOOL::view(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by MICROWAVE_TOOL::addMicrowaveFootprint(), DRAWING_TOOL::DrawVia(), and MODULE_EDITOR_TOOLS::PlacePad().

41 {
42  using namespace std::placeholders;
43  std::unique_ptr<BOARD_ITEM> newItem;
44 
45  Activate();
46 
47  BOARD_COMMIT commit( frame() );
48 
50 
51  // do not capture or auto-pan until we start placing an item
52  controls()->ShowCursor( true );
53  controls()->SetSnapping( true );
54 
55  // Add a VIEW_GROUP that serves as a preview for the new item
56  SELECTION preview;
57  view()->Add( &preview );
58 
59  aPlacer->m_board = board();
60  aPlacer->m_frame = frame();
61 
62  if( aOptions & IPO_SINGLE_CLICK )
63  {
64  VECTOR2I cursorPos = controls()->GetCursorPosition();
65 
66  newItem = aPlacer->CreateItem();
67  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
68 
69  preview.Add( newItem.get() );
70  }
71 
72  // Main loop: keep receiving events
73  while( OPT_TOOL_EVENT evt = Wait() )
74  {
75  VECTOR2I cursorPos = controls()->GetCursorPosition();
76 
78  {
79  if( newItem )
80  {
81  // Delete the old item and have another try
82  newItem = nullptr;
83 
84  preview.Clear();
85 
86  if( aOptions & IPO_SINGLE_CLICK )
87  break;
88 
89  controls()->SetAutoPan( false );
90  controls()->CaptureCursor( false );
91  controls()->ShowCursor( true );
92  }
93  else
94  {
95  break;
96  }
97 
98  if( evt->IsActivate() ) // now finish unconditionally
99  break;
100  }
101 
102  else if( evt->IsClick( BUT_LEFT ) )
103  {
104  if( !newItem )
105  {
106  // create the item if possible
107  newItem = aPlacer->CreateItem();
108 
109  // no item created, so wait for another click
110  if( !newItem )
111  continue;
112 
113  controls()->CaptureCursor( true );
114  controls()->SetAutoPan( true );
115 
116  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
117 
118  preview.Add( newItem.get() );
119 
120  if( newItem->Type() == PCB_MODULE_T )
121  {
122  auto module = dyn_cast<MODULE*>( newItem.get() );
123 
124  // modules have more drawable parts
125  module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) );
126  }
127  }
128  else
129  {
130  newItem->ClearFlags();
131  preview.Remove( newItem.get() );
132 
133  aPlacer->PlaceItem( newItem.get() );
134 
135  if( newItem->Type() == PCB_MODULE_T )
136  {
137  auto module = dyn_cast<MODULE*>( newItem.get() );
138  module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Remove, &preview, _1 ) );
139  }
140 
141  commit.Add( newItem.release() );
142  commit.Push( aCommitMessage );
143 
144  controls()->CaptureCursor( false );
145  controls()->SetAutoPan( false );
146  controls()->ShowCursor( true );
147 
148  if( !( aOptions & IPO_REPEAT ) )
149  break;
150 
151  if( aOptions & IPO_SINGLE_CLICK )
152  {
154 
155  newItem = aPlacer->CreateItem();
156  newItem->SetPosition( wxPoint( pos.x, pos.y ) );
157 
158  preview.Add( newItem.get() );
159  }
160  }
161  }
162 
163  else if( newItem && evt->Category() == TC_COMMAND )
164  {
165  /*
166  * Handle any events that can affect the item as we move
167  * it around, eg rotate and flip
168  */
169 
170  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) && ( aOptions & IPO_ROTATE ) )
171  {
172  const auto rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle(
173  *frame(), *evt );
174  newItem->Rotate( newItem->GetPosition(), rotationAngle );
175  view()->Update( &preview );
176  }
177  else if( evt->IsAction( &PCB_ACTIONS::flip ) && ( aOptions & IPO_FLIP ) )
178  {
179  newItem->Flip( newItem->GetPosition() );
180  view()->Update( &preview );
181  }
182  }
183 
184  else if( newItem && evt->IsMotion() )
185  {
186  // track the cursor
187  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
188 
189  // Show a preview of the item
190  view()->Update( &preview );
191  }
192  }
193 
194  view()->Remove( &preview );
195 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
virtual void ShowCursor(bool aEnabled)
Function ShowCursor() Enables or disables display of cursor.
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
void RunOnChildren(std::function< void(BOARD_ITEM *)> aFunction)
Function RunOnChildren.
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
virtual bool PlaceItem(BOARD_ITEM *aItem)
Definition: pcb_tool.h:51
virtual std::unique_ptr< BOARD_ITEM > CreateItem()=0
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
virtual void SetSnapping(bool aEnabled)
Function SetSnapping() Enables/disables snapping cursor to grid.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
PCB_EDIT_FRAME * m_frame
Definition: pcb_tool.h:53
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:73
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:124
class MODULE, a footprint
Definition: typeinfo.h:101
virtual VECTOR2D GetCursorPosition() const =0
Function GetCursorPosition() Returns the current cursor position in world coordinates.
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:125
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes an item from the group.
Definition: view_group.cpp:61
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual void Add(VIEW_ITEM *aItem)
Function Add() Adds an item to the group.
Definition: view_group.cpp:55
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:96
TOOL_MANAGER * GetManager() const
Function GetManager() Returns the instance of TOOL_MANAGER that takes care of the tool...
Definition: tool_base.h:144
void Activate()
Function Activate() Runs the tool.
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
int GetEventRotationAngle(const PCB_BASE_EDIT_FRAME &aFrame, const TOOL_EVENT &aEvt)
Function getEventRotationAngle()
BOARD * board() const
Definition: pcb_tool.h:126
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
bool PCB_TOOL::EditingModules ( ) const
inlineinherited

Definition at line 91 of file pcb_tool.h.

References PCB_TOOL::m_editModules.

Referenced by BOARD_COMMIT::BOARD_COMMIT(), PAD_TOOL::Init(), and EDIT_TOOL::MeasureTool().

92  {
93  return m_editModules;
94  }
bool m_editModules
Definition: pcb_tool.h:128
const TOOL_EVENT TOOL_INTERACTIVE::evActivate ( std::string  aToolName = "")
protectedinherited

functions below are not yet implemented - their interface may change

const TOOL_EVENT TOOL_INTERACTIVE::evButtonDown ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evButtonUp ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evClick ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evCommand ( int  aCommandId = -1)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evCommand ( std::string  aCommandStr = "")
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evDrag ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evMotion ( )
protectedinherited
int SELECTION_TOOL::filterSelection ( const TOOL_EVENT aEvent)
private

Invoke filter dialog and modify current selection

Definition at line 1190 of file selection_tool.cpp.

References PCB_TOOL::board(), clearSelection(), getFilteredLayerSet(), SELECTION::GetItems(), itemIsIncludedByFilter(), m_frame, m_priv, m_selection, and select().

Referenced by SetTransitions().

1191 {
1192  auto& opts = m_priv->m_filterOpts;
1193  DIALOG_BLOCK_OPTIONS dlg( m_frame, opts, false, _( "Filter selection" ) );
1194 
1195  const int cmd = dlg.ShowModal();
1196 
1197  if( cmd != wxID_OK )
1198  return 0;
1199 
1200  const auto& board = *getModel<BOARD>();
1201  const auto layerMask = getFilteredLayerSet( opts );
1202 
1203  // copy current selection
1204  auto selection = m_selection.GetItems();
1205 
1206  // clear current selection
1207  clearSelection();
1208 
1209  // copy selection items from the saved selection
1210  // according to the dialog options
1211  for( auto i : selection )
1212  {
1213  auto item = static_cast<BOARD_ITEM*>( i );
1214  bool include = itemIsIncludedByFilter( *item, board, layerMask, opts );
1215 
1216  if( include )
1217  {
1218  select( item );
1219  }
1220  }
1221  return 0;
1222 }
std::unique_ptr< PRIV > m_priv
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
const std::set< EDA_ITEM * > GetItems() const
Definition: selection.h:117
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
static bool itemIsIncludedByFilter(const BOARD_ITEM &aItem, const BOARD &aBoard, const LSET &aTechnlLayerMask, const DIALOG_BLOCK_OPTIONS::OPTIONS &aBlockOpts)
Function itemIsIncludedByFilter()
static LSET getFilteredLayerSet(const DIALOG_BLOCK_OPTIONS::OPTIONS &blockOpts)
Gets the technical layers that are part of the given selection opts.
BOARD * board() const
Definition: pcb_tool.h:126
int SELECTION_TOOL::find ( const TOOL_EVENT aEvent)
private

Find an item.

Definition at line 1062 of file selection_tool.cpp.

References DIALOG_FIND::EnableWarp(), findCallback(), m_frame, and DIALOG_FIND::SetCallback().

Referenced by SetTransitions().

1063 {
1064  DIALOG_FIND dlg( m_frame );
1065  dlg.EnableWarp( false );
1066  dlg.SetCallback( std::bind( &SELECTION_TOOL::findCallback, this, _1 ) );
1067  dlg.ShowModal();
1068 
1069  return 0;
1070 }
void findCallback(BOARD_ITEM *aItem)
Find dialog callback.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
void SELECTION_TOOL::findCallback ( BOARD_ITEM aItem)
private

Find dialog callback.

Definition at line 1043 of file selection_tool.cpp.

References clearSelection(), EDA_DRAW_PANEL_GAL::ForceRefresh(), EDA_ITEM::GetBoundingBox(), EDA_DRAW_FRAME::GetGalCanvas(), EDA_RECT::GetOrigin(), EDA_RECT::GetSize(), TOOL_BASE::getView(), m_frame, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ProcessEvent(), select(), SelectedEvent, and KIGFX::VIEW::SetViewport().

Referenced by find().

1044 {
1045  clearSelection();
1046 
1047  if( aItem )
1048  {
1049  select( aItem );
1050  EDA_RECT bbox = aItem->GetBoundingBox();
1051  BOX2D viewport( VECTOR2D( bbox.GetOrigin() ), VECTOR2D( bbox.GetSize() ) );
1052  getView()->SetViewport( viewport );
1053 
1054  // Inform other potentially interested tools
1056  }
1057 
1059 }
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
void ForceRefresh()
Function ForceRefresh() Forces a redraw.
void SetViewport(const BOX2D &aViewport)
Function SetViewport() Sets the visible area of the VIEW.
Definition: view.cpp:513
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
Class BOX2 handles a 2-D bounding box, built on top of an origin point and size vector, both of templated class Vec.
Definition: box2.h:41
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
const wxPoint & GetOrigin() const
VECTOR2< double > VECTOR2D
Definition: vector2d.h:589
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
Class EDA_RECT handles the component boundary box.
EDA_DRAW_PANEL_GAL * GetGalCanvas() const
Function GetGalCanvas returns a pointer to GAL-based canvas of given EDA draw frame.
Definition: draw_frame.h:817
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
const wxSize & GetSize() const
int SELECTION_TOOL::findMove ( const TOOL_EVENT aEvent)
private

Find an item and start moving.

Definition at line 1073 of file selection_tool.cpp.

References clearSelection(), KIGFX::VIEW_CONTROLS::ForceCursorPosition(), PCB_BASE_FRAME::GetFootprintFromBoardByReference(), MODULE::GetPosition(), TOOL_BASE::getViewControls(), TOOL_MANAGER::InvokeTool(), m_frame, TOOL_BASE::m_toolMgr, and toggleSelection().

Referenced by SetTransitions().

1074 {
1076 
1077  if( module )
1078  {
1079  clearSelection();
1080  toggleSelection( module );
1081 
1082  // Place event on module origin first, so the generic anchor snap
1083  // doesn't just choose the closest pin for us
1084  // Don't warp the view - we want the component to
1085  // "teleport" to cursor, not move to the components position
1086  getViewControls()->ForceCursorPosition( true, module->GetPosition() );
1087 
1088  // pick the component up and start moving
1089  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
1090  }
1091 
1092  return 0;
1093 }
const wxPoint & GetPosition() const override
Definition: class_module.h:155
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool InvokeTool(TOOL_ID aToolId)
Function InvokeTool() Calls a tool by sending a tool activation event to tool of given ID...
void toggleSelection(BOARD_ITEM *aItem)
Function toggleSelection() Changes selection status of a given item.
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Function ForceCursorPosition() Places the cursor immediately at a given point.
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
MODULE * GetFootprintFromBoardByReference()
Function GetFootprintFromBoardByReference.
Definition: modules.cpp:62
template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Function getEditFrame()

Returns the application window object, casted to requested user type.

Definition at line 193 of file tool_base.h.

References TOOL_BASE::getEditFrameInt().

Referenced by ZONE_CREATE_HELPER::commitZone(), ZONE_CREATE_HELPER::createNewZone(), TOOL_SETTINGS::getConfigBase(), and ZONE_CREATE_HELPER::performZoneCutout().

194  {
195  return static_cast<T*>( getEditFrameInt() );
196  }
T
enum T contains all this lexer's tokens.
wxWindow * getEditFrameInt() const
Definition: tool_base.cpp:42
TOOL_ID TOOL_BASE::GetId ( ) const
inlineinherited

Function GetId() Returns the unique identifier of the tool.

The identifier is set by an instance of TOOL_MANAGER.

Returns
Identifier of the tool.

Definition at line 122 of file tool_base.h.

References TOOL_BASE::m_toolId.

Referenced by TOOL_MANAGER::finishTool(), TOOL_MANAGER::InitTools(), TOOL_MANAGER::isActive(), TOOL_MANAGER::RegisterTool(), ACTION_MANAGER::RunHotKey(), and TOOL_MANAGER::runTool().

123  {
124  return m_toolId;
125  }
TOOL_ID m_toolId
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:215
TOOL_MANAGER* TOOL_BASE::GetManager ( ) const
inlineinherited

Function GetManager() Returns the instance of TOOL_MANAGER that takes care of the tool.

Returns
Instance of the TOOL_MANAGER. If there is no TOOL_MANAGER associated, it returns NULL.

Definition at line 144 of file tool_base.h.

References TOOL_BASE::m_toolMgr.

Referenced by BOARD_COMMIT::BOARD_COMMIT(), PCB_TOOL::doInteractiveItemPlacement(), CONTEXT_MENU::getToolManager(), EDIT_TOOL::MeasureTool(), and CONTEXT_MENU::onMenuEvent().

145  {
146  return m_toolMgr;
147  }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
template<typename T >
T* TOOL_BASE::getModel ( ) const
inlineprotectedinherited

Function getModel()

Returns the model object if it matches the requested type.

Definition at line 204 of file tool_base.h.

References TOOL_BASE::getModelInt().

Referenced by ZONE_CREATE_HELPER::createNewZone(), ZONE_CREATE_HELPER::createZoneFromExisting(), and ZONE_CREATE_HELPER::performZoneCutout().

205  {
206  EDA_ITEM* m = getModelInt();
207 
208  return static_cast<T*>( m );
209  }
T
enum T contains all this lexer's tokens.
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:151
EDA_ITEM * getModelInt() const
Definition: tool_base.cpp:48
const std::string& TOOL_BASE::GetName ( void  ) const
inlineinherited

Function GetName() Returns the name of the tool.

Tool names are expected to obey the format: application.ToolName (eg. pcbnew.InteractiveSelection).

Returns
The name of the tool.

Definition at line 133 of file tool_base.h.

References TOOL_BASE::m_toolName.

Referenced by TOOL_SETTINGS::getKeyName(), TOOL_MANAGER::InitTools(), TOOL_MANAGER::invokeTool(), and TOOL_MANAGER::RegisterTool().

134  {
135  return m_toolName;
136  }
std::string m_toolName
Name of the tool.
Definition: tool_base.h:219
TOOL_SETTINGS & TOOL_BASE::GetSettings ( )
inherited

Definition at line 72 of file tool_base.cpp.

References TOOL_BASE::m_toolSettings.

Referenced by ROUTER_TOOL::Init(), selectable(), and ROUTER_TOOL::~ROUTER_TOOL().

73 {
74  return m_toolSettings;
75 }
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:221
TOOL_MENU& SELECTION_TOOL::GetToolMenu ( )
inline

Definition at line 96 of file selection_tool.h.

References m_menu.

Referenced by ALIGN_DISTRIBUTE_TOOL::Init(), PAD_TOOL::Init(), POINT_EDITOR::Init(), PCB_EDITOR_CONTROL::Init(), and EDIT_TOOL::Init().

97  {
98  return m_menu;
99  }
TOOL_MENU m_menu
Menu model displayed by the tool.
TOOL_TYPE TOOL_BASE::GetType ( ) const
inlineinherited

Function GetType() Returns the type of the tool.

Returns
The type of the tool.

Definition at line 111 of file tool_base.h.

References TOOL_BASE::m_type.

Referenced by TOOL_MANAGER::InvokeTool(), and TOOL_MANAGER::runTool().

112  {
113  return m_type;
114  }
TOOL_TYPE m_type
Stores the type of the tool.
Definition: tool_base.h:212
KIGFX::VIEW * TOOL_BASE::getView ( ) const
protectedinherited

Function getView()

Returns the instance of VIEW object used in the application. It allows tools to draw.

Returns
The instance of VIEW.

Definition at line 30 of file tool_base.cpp.

References TOOL_MANAGER::GetView(), and TOOL_BASE::m_toolMgr.

Referenced by PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), PCBNEW_CONTROL::CursorControl(), disambiguationMenu(), MICROWAVE_TOOL::drawMicrowaveInductor(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), findCallback(), ROUTER_TOOL::getStartLayer(), PCBNEW_CONTROL::GridSetOrigin(), PCBNEW_CONTROL::HighContrastMode(), PNS::TOOL_BASE::highlightNet(), PCBNEW_CONTROL::LayerAlphaDec(), PCBNEW_CONTROL::LayerAlphaInc(), EDIT_TOOL::Main(), EDIT_TOOL::MeasureTool(), MODULE_EDITOR_TOOLS::ModuleEdgeOutlines(), MODULE_EDITOR_TOOLS::ModuleTextOutlines(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), PCBNEW_CONTROL::PadDisplayMode(), PCBNEW_CONTROL::PanControl(), PNS::TOOL_BASE::pickSingleItem(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PCB_EDITOR_CONTROL::Reset(), PCBNEW_CONTROL::Reset(), PNS::TOOL_BASE::Reset(), DRAWING_TOOL::Reset(), Reset(), selectable(), selectionContains(), selectMultiple(), ZOOM_TOOL::selectRegion(), PCBNEW_CONTROL::TrackDisplayMode(), POINT_EDITOR::updateEditedPoint(), COMMON_TOOLS::updateGrid(), PCBNEW_CONTROL::updateGrid(), POINT_EDITOR::updatePoints(), updateSelection(), PNS::TOOL_BASE::updateStartItem(), PCBNEW_CONTROL::ViaDisplayMode(), PCB_TOOL::view(), PCBNEW_CONTROL::ZoneDisplayMode(), COMMON_TOOLS::ZoomFitScreen(), zoomFitSelection(), COMMON_TOOLS::ZoomInOutCenter(), and ~SELECTION_TOOL().

31 {
32  return m_toolMgr->GetView();
33 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:243
KIGFX::VIEW_CONTROLS * TOOL_BASE::getViewControls ( ) const
protectedinherited

Function getViewControls()

Returns the instance of VIEW_CONTROLS object used in the application. It allows tools to read & modify user input and its settings (eg. show cursor, enable snapping to grid, etc.)

Returns
The instance of VIEW_CONTROLS.

Definition at line 36 of file tool_base.cpp.

References TOOL_MANAGER::GetViewControls(), and TOOL_BASE::m_toolMgr.

Referenced by POINT_EDITOR::addCorner(), PCBNEW_CONTROL::AppendBoard(), PCB_TOOL::controls(), MODULE_EDITOR_TOOLS::CopyItems(), PCBNEW_CONTROL::CursorControl(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawZone(), MODULE_EDITOR_TOOLS::EnumeratePads(), findMove(), EDIT_TOOL::getModificationPoint(), PCB_EDITOR_CONTROL::HighlightNet(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), ROUTER_TOOL::performDragging(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PNS::TOOL_BASE::Reset(), DRAWING_TOOL::Reset(), PCBNEW_CONTROL::ResetCoords(), DRAWING_TOOL::runPolygonEventLoop(), selectCursor(), selectMultiple(), ZOOM_TOOL::selectRegion(), PICKER_TOOL::setControls(), POINT_EDITOR::setEditedPoint(), COMMON_TOOLS::ZoomCenter(), and COMMON_TOOLS::ZoomInOut().

37 {
38  return m_toolMgr->GetViewControls();
39 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
KIGFX::VIEW_CONTROLS * GetViewControls() const
Definition: tool_manager.h:248
template<class T >
void TOOL_INTERACTIVE::Go ( int(T::*)(const TOOL_EVENT &)  aStateFunc,
const TOOL_EVENT_LIST aConditions = TOOL_EVENTTC_ANYTA_ANY ) 
)
inherited

Function Go()

Defines which state (aStateFunc) to go when a certain event arrives (aConditions). No conditions means any event.

Definition at line 122 of file tool_interactive.h.

References TOOL_INTERACTIVE::goInternal().

Referenced by LENGTH_TUNER_TOOL::Reset(), ZOOM_TOOL::SetTransitions(), LENGTH_TUNER_TOOL::SetTransitions(), ROUTER_TOOL::SetTransitions(), PAD_TOOL::SetTransitions(), MICROWAVE_TOOL::SetTransitions(), POINT_EDITOR::SetTransitions(), COMMON_TOOLS::SetTransitions(), ALIGN_DISTRIBUTE_TOOL::SetTransitions(), PCBNEW_CONTROL::SetTransitions(), POSITION_RELATIVE_TOOL::SetTransitions(), MODULE_EDITOR_TOOLS::SetTransitions(), PICKER_TOOL::SetTransitions(), PCB_EDITOR_CONTROL::SetTransitions(), EDIT_TOOL::SetTransitions(), SetTransitions(), and DRAWING_TOOL::SetTransitions().

124 {
125  TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
126 
127  goInternal( sptr, aConditions );
128 }
std::function< int(const TOOL_EVENT &)> TOOL_STATE_FUNC
Definition: tool_base.h:59
void goInternal(TOOL_STATE_FUNC &aState, const TOOL_EVENT_LIST &aConditions)
void SELECTION_TOOL::guessSelectionCandidates ( GENERAL_COLLECTOR aCollector) const
private

Function guessSelectionCandidates() Tries to guess best selection candidates in case multiple items are clicked, by doing some braindead heuristics.

Parameters
aCollectoris the collector that has a list of items to be queried.

Definition at line 1652 of file selection_tool.cpp.

References COLLECTOR::Append(), B_SilkS, calcArea(), calcCommonArea(), calcMaxArea(), calcMinArea(), calcRatio(), COLLECTOR::CountType(), COLLECTOR::Empty(), F_SilkS, PCB_BASE_FRAME::GetActiveLayer(), COLLECTOR::GetCount(), BOARD_ITEM::GetLayer(), m_frame, max, min, mod, PCB_LINE_T, PCB_MODULE_T, PCB_MODULE_TEXT_T, PCB_PAD_T, PCB_TEXT_T, PCB_TRACE_T, PCB_VIA_T, COLLECTOR::Remove(), and EDA_ITEM::Type().

Referenced by selectPoint().

1653 {
1654  std::set<BOARD_ITEM*> rejected;
1655 
1656  const double footprintAreaRatio = 0.2;
1657  const double modulePadMinCoverRatio = 0.45;
1658  const double padViaAreaRatio = 0.5;
1659  const double trackViaLengthRatio = 2.0;
1660  const double trackTrackLengthRatio = 0.3;
1661  const double textToFeatureMinRatio = 0.2;
1662  const double textToFootprintMinRatio = 0.4;
1663  // If the common area of two compared items is above the following threshold, they cannot
1664  // be rejected (it means they overlap and it might be hard to pick one by selecting
1665  // its unique area).
1666  const double commonAreaRatio = 0.6;
1667 
1668  PCB_LAYER_ID actLayer = m_frame->GetActiveLayer();
1669 
1670  LSET silkLayers( 2, B_SilkS, F_SilkS );
1671 
1672  if( silkLayers[actLayer] )
1673  {
1674  std::set<BOARD_ITEM*> preferred;
1675 
1676  for( int i = 0; i < aCollector.GetCount(); ++i )
1677  {
1678  BOARD_ITEM* item = aCollector[i];
1679  KICAD_T type = item->Type();
1680 
1681  if( ( type == PCB_MODULE_TEXT_T || type == PCB_TEXT_T || type == PCB_LINE_T )
1682  && silkLayers[item->GetLayer()] )
1683  {
1684  preferred.insert( item );
1685  }
1686  }
1687 
1688  if( preferred.size() != 0 )
1689  {
1690  aCollector.Empty();
1691 
1692  for( BOARD_ITEM* item : preferred )
1693  aCollector.Append( item );
1694  return;
1695  }
1696  }
1697 
1698  if( aCollector.CountType( PCB_MODULE_TEXT_T ) > 0 )
1699  {
1700  for( int i = 0; i < aCollector.GetCount(); ++i )
1701  {
1702  if( TEXTE_MODULE* txt = dyn_cast<TEXTE_MODULE*>( aCollector[i] ) )
1703  {
1704  double textArea = calcArea( txt );
1705 
1706  for( int j = 0; j < aCollector.GetCount(); ++j )
1707  {
1708  if( i == j )
1709  continue;
1710 
1711  BOARD_ITEM* item = aCollector[j];
1712  double itemArea = calcArea( item );
1713  double areaRatio = calcRatio( textArea, itemArea );
1714  double commonArea = calcCommonArea( txt, item );
1715  double itemCommonRatio = calcRatio( commonArea, itemArea );
1716  double txtCommonRatio = calcRatio( commonArea, textArea );
1717 
1718  if( item->Type() == PCB_MODULE_T && areaRatio < textToFootprintMinRatio &&
1719  itemCommonRatio < commonAreaRatio )
1720  rejected.insert( item );
1721 
1722  switch( item->Type() )
1723  {
1724  case PCB_TRACE_T:
1725  case PCB_PAD_T:
1726  case PCB_LINE_T:
1727  case PCB_VIA_T:
1728  case PCB_MODULE_T:
1729  if( areaRatio > textToFeatureMinRatio && txtCommonRatio < commonAreaRatio )
1730  rejected.insert( txt );
1731  break;
1732  default:
1733  break;
1734  }
1735  }
1736  }
1737  }
1738  }
1739 
1740  if( aCollector.CountType( PCB_MODULE_T ) > 0 )
1741  {
1742  double minArea = calcMinArea( aCollector, PCB_MODULE_T );
1743  double maxArea = calcMaxArea( aCollector, PCB_MODULE_T );
1744 
1745  if( calcRatio( minArea, maxArea ) <= footprintAreaRatio )
1746  {
1747  for( int i = 0; i < aCollector.GetCount(); ++i )
1748  {
1749  if( MODULE* mod = dyn_cast<MODULE*>( aCollector[i] ) )
1750  {
1751  double normalizedArea = calcRatio( calcArea( mod ), maxArea );
1752 
1753  if( normalizedArea > footprintAreaRatio )
1754  rejected.insert( mod );
1755  }
1756  }
1757  }
1758  }
1759 
1760  if( aCollector.CountType( PCB_PAD_T ) > 0 )
1761  {
1762  for( int i = 0; i < aCollector.GetCount(); ++i )
1763  {
1764  if( D_PAD* pad = dyn_cast<D_PAD*>( aCollector[i] ) )
1765  {
1766  double ratio = pad->GetParent()->PadCoverageRatio();
1767 
1768  if( ratio < modulePadMinCoverRatio )
1769  rejected.insert( pad->GetParent() );
1770  }
1771  }
1772  }
1773 
1774  if( aCollector.CountType( PCB_VIA_T ) > 0 )
1775  {
1776  for( int i = 0; i < aCollector.GetCount(); ++i )
1777  {
1778  if( VIA* via = dyn_cast<VIA*>( aCollector[i] ) )
1779  {
1780  double viaArea = calcArea( via );
1781 
1782  for( int j = 0; j < aCollector.GetCount(); ++j )
1783  {
1784  if( i == j )
1785  continue;
1786 
1787  BOARD_ITEM* item = aCollector[j];
1788  double areaRatio = calcRatio( viaArea, calcArea( item ) );
1789 
1790  if( item->Type() == PCB_MODULE_T && areaRatio < modulePadMinCoverRatio )
1791  rejected.insert( item );
1792 
1793  if( item->Type() == PCB_PAD_T && areaRatio < padViaAreaRatio )
1794  rejected.insert( item );
1795 
1796  if( TRACK* track = dyn_cast<TRACK*>( item ) )
1797  {
1798  if( track->GetNetCode() != via->GetNetCode() )
1799  continue;
1800 
1801  double lenRatio = (double) ( track->GetLength() + track->GetWidth() ) /
1802  (double) via->GetWidth();
1803 
1804  if( lenRatio > trackViaLengthRatio )
1805  rejected.insert( track );
1806  }
1807  }
1808  }
1809  }
1810  }
1811 
1812  int nTracks = aCollector.CountType( PCB_TRACE_T );
1813 
1814  if( nTracks > 0 )
1815  {
1816  double maxLength = 0.0;
1817  double minLength = std::numeric_limits<double>::max();
1818  double maxArea = 0.0;
1819  const TRACK* maxTrack = nullptr;
1820 
1821  for( int i = 0; i < aCollector.GetCount(); ++i )
1822  {
1823  if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) )
1824  {
1825  maxLength = std::max( track->GetLength(), maxLength );
1826  maxLength = std::max( (double) track->GetWidth(), maxLength );
1827 
1828  minLength = std::min( std::max( track->GetLength(), (double) track->GetWidth() ), minLength );
1829 
1830  double area = track->GetLength() * track->GetWidth();
1831 
1832  if( area > maxArea )
1833  {
1834  maxArea = area;
1835  maxTrack = track;
1836  }
1837  }
1838  }
1839 
1840  if( maxLength > 0.0 && minLength / maxLength < trackTrackLengthRatio && nTracks > 1 )
1841  {
1842  for( int i = 0; i < aCollector.GetCount(); ++i )
1843  {
1844  if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) )
1845  {
1846  double ratio = std::max( (double) track->GetWidth(), track->GetLength() ) / maxLength;
1847 
1848  if( ratio > trackTrackLengthRatio )
1849  rejected.insert( track );
1850  }
1851  }
1852  }
1853 
1854  for( int j = 0; j < aCollector.GetCount(); ++j )
1855  {
1856  if( MODULE* mod = dyn_cast<MODULE*>( aCollector[j] ) )
1857  {
1858  double ratio = calcRatio( maxArea, mod->GetFootprintRect().GetArea() );
1859 
1860  if( ratio < modulePadMinCoverRatio && calcCommonArea( maxTrack, mod ) < commonAreaRatio )
1861  rejected.insert( mod );
1862  }
1863  }
1864  }
1865 
1866  if( (unsigned) aCollector.GetCount() > rejected.size() ) // do not remove everything
1867  {
1868  for( BOARD_ITEM* item : rejected )
1869  {
1870  aCollector.Remove( item );
1871  }
1872  }
1873 }
void Empty()
Function Empty sets the list to empty.
int GetCount() const
Function GetCount returns the number of objects in the list.
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
static double calcCommonArea(const BOARD_ITEM *aItem, const BOARD_ITEM *aOther)
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:104
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
int CountType(KICAD_T aType)
Function CountType counts the number of items matching aType.
static double calcArea(const BOARD_ITEM *aItem)
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
void Append(EDA_ITEM *item)
Function Append adds an item to the end of the list.
class MODULE, a footprint
Definition: typeinfo.h:101
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
static double calcMaxArea(GENERAL_COLLECTOR &aCollector, KICAD_T aType)
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:105
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
#define max(a, b)
Definition: auxiliary.h:86
double calcRatio(double a, double b)
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:103
virtual PCB_LAYER_ID GetActiveLayer() const
Function GetActiveLayer returns the active layer.
#define mod(a, n)
Definition: greymap.cpp:24
#define min(a, b)
Definition: auxiliary.h:85
static double calcMinArea(GENERAL_COLLECTOR &aCollector, KICAD_T aType)
bool SELECTION_TOOL::Init ( )
overridevirtual

Function Init() Init() is called once upon a registration of the tool.

Returns
True if the initialization went fine, false - otherwise.

Reimplemented from TOOL_BASE.

Definition at line 192 of file selection_tool.cpp.

References CONDITIONAL_MENU::AddMenu(), TOOL_MENU::AddStandardSubMenus(), TOOL_MENU::AddSubMenu(), TOOL_MENU::GetMenu(), m_menu, and SELECTION_CONDITIONS::NotEmpty().

193 {
194  auto selectMenu = std::make_shared<SELECT_MENU>();
195  selectMenu->SetTool( this );
196  m_menu.AddSubMenu( selectMenu );
197 
198  auto& menu = m_menu.GetMenu();
199 
200  menu.AddMenu( selectMenu.get(), false, SELECTION_CONDITIONS::NotEmpty );
201  // only show separator if there is a Select menu to show above it
202  menu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 1000 );
203 
204  m_menu.AddStandardSubMenus( *getEditFrame<PCB_BASE_FRAME>() );
205 
206  return true;
207 }
CONDITIONAL_MENU & GetMenu()
Function GetMenu.
Definition: tool_menu.cpp:49
void AddSubMenu(std::shared_ptr< CONTEXT_MENU > aSubMenu)
Function CreateSubMenu.
Definition: tool_menu.cpp:55
static bool NotEmpty(const SELECTION &aSelection)
Function NotEmpty Tests if there are any items selected.
void AddStandardSubMenus(EDA_DRAW_FRAME &aFrame)
Function CreateBasicMenu.
Definition: tool_menu.cpp:95
TOOL_MENU m_menu
Menu model displayed by the tool.
void AddMenu(CONTEXT_MENU *aMenu, bool aExpand=false, const SELECTION_CONDITION &aCondition=SELECTION_CONDITIONS::ShowAlways, int aOrder=ANY_ORDER)
Function AddMenu()
int SELECTION_TOOL::Main ( const TOOL_EVENT aEvent)

Function Main()

The main loop.

Definition at line 233 of file selection_tool.cpp.

References BUT_LEFT, BUT_RIGHT, clearSelection(), TOOL_MENU::CloseContextMenu(), SELECTION::Empty(), PCB_ACTIONS::highlightNet, TOOL_MANAGER::InvokeTool(), m_additive, PCB_TOOL::m_editModules, m_menu, m_selection, m_subtractive, TOOL_BASE::m_toolMgr, MD_CTRL, MD_SHIFT, PCB_ACTIONS::properties, TOOL_MANAGER::RunAction(), selectCursor(), selectionContains(), selectMultiple(), selectPoint(), TOOL_MENU::ShowContextMenu(), TA_CONTEXT_MENU_CLOSED, TA_UNDO_REDO_PRE, and TOOL_INTERACTIVE::Wait().

Referenced by SetTransitions().

234 {
235  // Main loop: keep receiving events
236  while( OPT_TOOL_EVENT evt = Wait() )
237  {
238  // Should selected items be added to the current selection or
239  // become the new selection (discarding previously selected items)
240  m_additive = evt->Modifier( MD_SHIFT );
241 
242  // Should selected items be REMOVED from the current selection?
243  // This will be ignored if the SHIFT modifier is pressed
244  m_subtractive = !m_additive && evt->Modifier( MD_CTRL );
245 
246  // Single click? Select single object
247  if( evt->IsClick( BUT_LEFT ) )
248  {
249  if( evt->Modifier( MD_CTRL ) && !m_editModules )
250  {
252  }
253  else
254  {
255  // If no modifier keys are pressed, clear the selection
256  if( !m_additive )
257  {
258  clearSelection();
259  }
260 
261  selectPoint( evt->Position() );
262  }
263  }
264 
265  // right click? if there is any object - show the context menu
266  else if( evt->IsClick( BUT_RIGHT ) )
267  {
268  bool emptySelection = m_selection.Empty();
269 
270  if( emptySelection )
271  selectPoint( evt->Position() );
272 
274  }
275 
276  // double click? Display the properties window
277  else if( evt->IsDblClick( BUT_LEFT ) )
278  {
279  if( m_selection.Empty() )
280  selectPoint( evt->Position() );
281 
283  }
284 
285  // drag with LMB? Select multiple objects (or at least draw a selection box) or drag them
286  else if( evt->IsDrag( BUT_LEFT ) )
287  {
288  if( m_additive || m_subtractive )
289  {
290  selectMultiple();
291  }
292  else if( m_selection.Empty() )
293  {
294  // There is nothing selected, so try to select something
295  if( !selectCursor() )
296  {
297  // If nothings has been selected or user wants to select more
298  // draw the selection box
299  selectMultiple();
300  }
301  else
302  {
303  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
304  }
305  }
306 
307  else
308  {
309  // Check if dragging has started within any of selected items bounding box
310  if( selectionContains( evt->Position() ) )
311  {
312  // Yes -> run the move tool and wait till it finishes
313  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
314  }
315  else
316  {
317  // No -> clear the selection list
318  clearSelection();
319  }
320  }
321  }
322 
323  else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO_PRE )
324  {
325  clearSelection();
326  }
327 
328  else if( evt->Action() == TA_CONTEXT_MENU_CLOSED )
329  {
330  m_menu.CloseContextMenu( evt );
331  }
332  }
333 
334  // This tool is supposed to be active forever
335  assert( false );
336 
337  return 0;
338 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
bool m_additive
Flag saying if items should be added to the current selection or rather replace it.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:102
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
bool InvokeTool(TOOL_ID aToolId)
Function InvokeTool() Calls a tool by sending a tool activation event to tool of given ID...
bool selectMultiple()
Function selectMultiple() Handles drawing a selection box that allows to select many items at the sam...
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
TOOL_MENU m_menu
Menu model displayed by the tool.
bool selectPoint(const VECTOR2I &aWhere, bool aOnDrag=false)
Function selectPoint() Selects an item pointed by the parameter aWhere.
bool m_editModules
Definition: pcb_tool.h:128
bool m_subtractive
Flag saying if items should be removed from the current selection.
void CloseContextMenu(OPT_TOOL_EVENT &evt)
Function CloseContextMenu.
Definition: tool_menu.cpp:82
static TOOL_ACTION highlightNet
Definition: pcb_actions.h:356
bool selectionContains(const VECTOR2I &aPoint) const
Function selectionContains() Checks if the given point is placed within any of selected items' boundi...
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
bool SELECTION_TOOL::modifiable ( const BOARD_ITEM aItem) const
private

Function modifiable() Checks if an item might be modified.

This function is used to filter out items from the selection when it is passed to other tools.

Returns
True if the item fulfills conditions to be modified.
BOARD_ITEM * SELECTION_TOOL::pickSmallestComponent ( GENERAL_COLLECTOR aCollector)
private

Function pickSmallestComponent() Allows to find the smallest (in terms of bounding box area) item from the list.

Parameters
aCollectorcontaines the list of items.

Definition at line 1320 of file selection_tool.cpp.

References MODULE::GetBoundingBox(), COLLECTOR::GetCount(), EDA_RECT::GetHeight(), GENERAL_COLLECTOR::GetPrimaryCount(), EDA_RECT::GetWidth(), min, and PCB_MODULE_T.

1321 {
1322  int count = aCollector->GetPrimaryCount(); // try to use preferred layer
1323 
1324  if( 0 == count )
1325  count = aCollector->GetCount();
1326 
1327  for( int i = 0; i < count; ++i )
1328  {
1329  if( ( *aCollector )[i]->Type() != PCB_MODULE_T )
1330  return NULL;
1331  }
1332 
1333  // All are modules, now find smallest MODULE
1334  int minDim = 0x7FFFFFFF;
1335  int minNdx = 0;
1336 
1337  for( int i = 0; i < count; ++i )
1338  {
1339  MODULE* module = (MODULE*) ( *aCollector )[i];
1340 
1341  int lx = module->GetBoundingBox().GetWidth();
1342  int ly = module->GetBoundingBox().GetHeight();
1343 
1344  int lmin = std::min( lx, ly );
1345 
1346  if( lmin < minDim )
1347  {
1348  minDim = lmin;
1349  minNdx = i;
1350  }
1351  }
1352 
1353  return (*aCollector)[minNdx];
1354 }
int GetCount() const
Function GetCount returns the number of objects in the list.
int GetHeight() const
class MODULE, a footprint
Definition: typeinfo.h:101
const EDA_RECT GetBoundingBox() const override
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
int GetPrimaryCount()
Function GetPrimaryCount.
Definition: collectors.h:344
int GetWidth() const
#define min(a, b)
Definition: auxiliary.h:85
SELECTION & SELECTION_TOOL::RequestSelection ( int  aFlags = SELECTION_DEFAULT)

Function RequestSelection()

Returns the current selection set, filtered according to aFlags. If the set is empty, performs the legacy-style hover selection.

Definition at line 347 of file selection_tool.cpp.

References SELECTION::Empty(), SELECTION::GetSize(), m_selection, TOOL_BASE::m_toolMgr, PCB_MARKER_T, TOOL_MANAGER::RunAction(), SanitizeSelection(), SELECTION_EDITABLE, SELECTION_SANITIZE_PADS, PCB_ACTIONS::selectionCursor, SELECTION::SetIsHover(), EDA_ITEM::Type(), and unselect().

Referenced by EDIT_TOOL::CreateArray(), EDIT_TOOL::Duplicate(), EDIT_TOOL::editFootprintInFpEditor(), EDIT_TOOL::ExchangeFootprints(), EDIT_TOOL::Flip(), EDIT_TOOL::Main(), EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), EDIT_TOOL::Remove(), and EDIT_TOOL::Rotate().

348 {
349  if ( m_selection.Empty() )
350  {
352  m_selection.SetIsHover( true );
353  }
354  else
355  {
356  m_selection.SetIsHover( false );
357  }
358 
359  // Be careful with iterators: items can be removed from list
360  // that invalidate iterators.
361  for( unsigned ii = 0; ii < m_selection.GetSize(); ii++ )
362  {
363  EDA_ITEM* item = m_selection[ii];
364 
365  if( ( aFlags & SELECTION_EDITABLE ) && item->Type() == PCB_MARKER_T )
366  {
367  unselect( static_cast<BOARD_ITEM *>( item ) );
368  }
369  }
370 
371  if ( aFlags & SELECTION_SANITIZE_PADS )
373 
374  return m_selection;
375 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
void SetIsHover(bool aIsHover)
Definition: selection.h:61
SELECTION m_selection
Current state of selection.
virtual unsigned int GetSize() const override
Function GetSize() Returns the number of stored items.
Definition: selection.h:86
class MARKER_PCB, a marker used to show something
Definition: typeinfo.h:111
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:151
bool SanitizeSelection()
Makes sure a group selection does not contain items that would cause conflicts when moving/rotating t...
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
Definition: pcb_actions.h:50
void SELECTION_TOOL::Reset ( RESET_REASON  aReason)
overridevirtual

Function Reset() Brings the tool to a known, initial state.

If the tool claimed anything from the model or the view, it must release it when its reset.

Parameters
aReasoncontains information about the reason of tool reset.

Implements TOOL_BASE.

Definition at line 210 of file selection_tool.cpp.

References KIGFX::VIEW::Add(), SELECTION::Clear(), clearSelection(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), TOOL_BASE::getView(), m_frame, m_locked, m_selection, TOOL_BASE::MODEL_RELOAD, KIGFX::VIEW::Remove(), and KIGFX::RENDER_SETTINGS::SetHighlight().

211 {
212  m_frame = getEditFrame<PCB_BASE_FRAME>();
213  m_locked = true;
214 
215  if( aReason == TOOL_BASE::MODEL_RELOAD )
216  {
217  // Remove pointers to the selected items from containers
218  // without changing their properties (as they are already deleted
219  // while a new board is loaded)
220  m_selection.Clear();
221  getView()->GetPainter()->GetSettings()->SetHighlight( false );
222  }
223  else
224  // Restore previous properties of selected items and remove them from containers
225  clearSelection();
226 
227  // Reinsert the VIEW_GROUP, in case it was removed from the VIEW
228  getView()->Remove( &m_selection );
229  getView()->Add( &m_selection );
230 }
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
Model changes (required full reload)
Definition: tool_base.h:83
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:196
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
bool m_locked
Can other tools modify locked items.
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
void SetHighlight(bool aEnabled, int aNetcode=-1)
Function SetHighlight Turns on/off highlighting - it may be done for the active layer or the specifie...
Definition: painter.h:140
void TOOL_INTERACTIVE::RunMainStack ( std::function< void()>  aFunc)
inherited

Function RunMainStack()

Calls a function using the main stack.

Parameters
aFuncis the function to be calls.

Definition at line 78 of file tool_interactive.cpp.

References TOOL_BASE::m_toolMgr, and TOOL_MANAGER::RunMainStack().

Referenced by DRAWING_TOOL::PlaceText().

79 {
80  m_toolMgr->RunMainStack( this, std::move( aFunc ) );
81 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void RunMainStack(TOOL_BASE *aTool, std::function< void()> aFunc)
bool SELECTION_TOOL::SanitizeSelection ( )

Makes sure a group selection does not contain items that would cause conflicts when moving/rotating together (e.g.

a footprint and one of the same footprint's pads)

Definition at line 1884 of file selection_tool.cpp.

References MODULE::IsLocked(), EDA_ITEM::IsSelected(), PCB_TOOL::m_editModules, m_selection, TOOL_BASE::m_toolMgr, mod, MODULE::PadsLocked(), PCB_PAD_T, TOOL_MANAGER::ProcessEvent(), select(), SelectedEvent, unselect(), and UnselectedEvent.

Referenced by CursorSelection(), deleteItem(), RequestSelection(), and selectPRitem().

1885 {
1886  std::set<BOARD_ITEM*> rejected;
1887  std::set<BOARD_ITEM*> added;
1888 
1889  if( !m_editModules )
1890  {
1891  for( auto i : m_selection )
1892  {
1893  auto item = static_cast<BOARD_ITEM*>( i );
1894  if( item->Type() == PCB_PAD_T )
1895  {
1896  MODULE* mod = static_cast<MODULE*>( item->GetParent() );
1897 
1898  // case 1: module (or its pads) are locked
1899  if( mod && ( mod->PadsLocked() || mod->IsLocked() ) )
1900  {
1901  rejected.insert( item );
1902 
1903  if( !mod->IsLocked() && !mod->IsSelected() )
1904  added.insert( mod );
1905  }
1906 
1907  // case 2: multi-item selection contains both the module and its pads - remove the pads
1908  if( mod && m_selection.Contains( mod ) )
1909  rejected.insert( item );
1910  }
1911  }
1912  }
1913 
1914  if( !rejected.empty() )
1915  {
1916  for( BOARD_ITEM* item : rejected )
1917  unselect( item );
1918 
1919  // Inform other potentially interested tools
1921  }
1922 
1923  if( !added.empty() )
1924  {
1925  for( BOARD_ITEM* item : added )
1926  select( item );
1927 
1928  // Inform other potentially interested tools
1930  }
1931 
1932  return true;
1933 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool IsSelected() const
Definition: base_struct.h:221
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
bool PadsLocked() const
Definition: class_module.h:272
SELECTION m_selection
Current state of selection.
static const TOOL_EVENT UnselectedEvent
Event sent after an item is unselected.
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:236
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
bool m_editModules
Definition: pcb_tool.h:128
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
#define mod(a, n)
Definition: greymap.cpp:24
void SELECTION_TOOL::select ( BOARD_ITEM aItem)
private

Function select() Takes necessary action mark an item as selected.

Parameters
aItemis an item to be selected.

Definition at line 1461 of file selection_tool.cpp.

References SELECTION::Add(), SELECTION::Contains(), BOARD_ITEM::GetParent(), EDA_ITEM::IsSelected(), m_frame, m_selection, PCB_PAD_T, selectVisually(), PCB_BASE_FRAME::SetCurItem(), SELECTION::Size(), and EDA_ITEM::Type().

Referenced by filterSelection(), findCallback(), SanitizeSelection(), selectAllItemsConnectedToItem(), selectAllItemsConnectedToTrack(), selectAllItemsOnNet(), selectAllItemsOnSheet(), SelectItem(), SelectItems(), selectMultiple(), and toggleSelection().

1462 {
1463  if( aItem->IsSelected() )
1464  {
1465  return;
1466  }
1467 
1468  if( aItem->Type() == PCB_PAD_T )
1469  {
1470  MODULE* module = static_cast<MODULE*>( aItem->GetParent() );
1471 
1472  if( m_selection.Contains( module ) )
1473  return;
1474  }
1475 
1476  m_selection.Add( aItem );
1477  selectVisually( aItem );
1478 
1479 
1480  if( m_selection.Size() == 1 )
1481  {
1482  // Set as the current item, so the information about selection is displayed
1483  m_frame->SetCurItem( aItem, true );
1484  }
1485  else if( m_selection.Size() == 2 ) // Check only for 2, so it will not be
1486  { // called for every next selected item
1487  // If multiple items are selected, do not show the information about the selected item
1488  m_frame->SetCurItem( NULL, true );
1489  }
1490 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
BOARD_ITEM_CONTAINER * GetParent() const
bool Contains(EDA_ITEM *aItem) const
Definition: selection.h:100
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
bool IsSelected() const
Definition: base_struct.h:221
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
void selectVisually(BOARD_ITEM *aItem)
Function selectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST.
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
bool SELECTION_TOOL::selectable ( const BOARD_ITEM aItem) const
private

Function selectable() Checks conditions for an item to be selected.

Returns
True if the item fulfills conditions to be selected.

Definition at line 1357 of file selection_tool.cpp.

References B_Cu, PCB_TOOL::board(), F_Cu, KIGFX::RENDER_SETTINGS::GetHighContrast(), BOARD_ITEM::GetLayer(), KIGFX::VIEW::GetPainter(), TOOL_BASE::GetSettings(), KIGFX::PAINTER::GetSettings(), TOOL_BASE::getView(), BOARD::IsElementVisible(), BOARD::IsLayerVisible(), MODULE::IsLocked(), BOARD_ITEM::IsOnLayer(), KIGFX::VIEW::IsVisible(), LAYER_MOD_BK, LAYER_MOD_FR, PCB_TOOL::m_editModules, m_multiple, mod, NOT_USED, PCB_MODULE_EDGE_T, PCB_MODULE_T, PCB_MODULE_TEXT_T, PCB_PAD_T, PCB_VIA_T, EDA_ITEM::Type(), TYPE_NOT_INIT, PCB_TOOL::view(), KIGFX::VIEW::VIEW_MAX_LAYERS, and BOARD_ITEM::ViewGetLayers().

Referenced by selectMultiple(), selectPoint(), and toggleSelection().

1358 {
1359  // Is high contrast mode enabled?
1360  bool highContrast = getView()->GetPainter()->GetSettings()->GetHighContrast();
1361 
1362  if( highContrast )
1363  {
1364  bool onActive = false; // Is the item on any of active layers?
1365  int layers[KIGFX::VIEW::VIEW_MAX_LAYERS], layers_count;
1366 
1367  // Filter out items that do not belong to active layers
1368  const std::set<unsigned int>& activeLayers = getView()->GetPainter()->
1369  GetSettings()->GetActiveLayers();
1370  aItem->ViewGetLayers( layers, layers_count );
1371 
1372  for( int i = 0; i < layers_count; ++i )
1373  {
1374  if( activeLayers.count( layers[i] ) > 0 ) // Item is on at least one of the active layers
1375  {
1376  onActive = true;
1377  break;
1378  }
1379  }
1380 
1381  if( !onActive ) // We do not want to select items that are in the background
1382  return false;
1383  }
1384 
1385  switch( aItem->Type() )
1386  {
1387  case PCB_VIA_T:
1388  {
1389  // For vias it is enough if only one of layers is visible
1390  PCB_LAYER_ID top, bottom;
1391 
1392  static_cast<const VIA*>( aItem )->LayerPair( &top, &bottom );
1393 
1394  return board()->IsLayerVisible( top ) || board()->IsLayerVisible( bottom );
1395  }
1396  break;
1397 
1398  case PCB_MODULE_T:
1399 
1400  // In the module editor, we do not want to select the module itself
1401  // rather, the module sub-components should be selected individually
1402  if( m_editModules )
1403  {
1404  return false;
1405  }
1406 
1407  if( aItem->IsOnLayer( F_Cu ) && board()->IsElementVisible( LAYER_MOD_FR ) )
1408  return !m_editModules;
1409 
1410  if( aItem->IsOnLayer( B_Cu ) && board()->IsElementVisible( LAYER_MOD_BK ) )
1411  return !m_editModules;
1412 
1413  return false;
1414 
1415  break;
1416 
1417  case PCB_MODULE_TEXT_T:
1418  if( m_multiple && !m_editModules )
1419  return false;
1420 
1421  return view()->IsVisible( aItem ) && board()->IsLayerVisible( aItem->GetLayer() );
1422 
1423  case PCB_MODULE_EDGE_T:
1424  case PCB_PAD_T:
1425  {
1426  // Multiple selection is only allowed in modedit mode
1427  // In pcbnew, you have to select subparts of modules
1428  // one-by-one, rather than with a drag selection.
1429  // This is so you can pick up items under an (unlocked)
1430  // module without also moving the module's sub-parts.
1431  if( m_multiple && !m_editModules )
1432  return false;
1433 
1434  // When editing modules, it's allowed to select them, even when
1435  // locked, since you already have to explicitly activate the
1436  // module editor to get to this stage
1437  if ( !m_editModules )
1438  {
1439  MODULE* mod = static_cast<const D_PAD*>( aItem )->GetParent();
1440  if( mod && mod->IsLocked() )
1441  return false;
1442  }
1443 
1444  break;
1445  }
1446 
1447  // These are not selectable
1448  case NOT_USED:
1449  case TYPE_NOT_INIT:
1450  return false;
1451 
1452  default: // Suppress warnings
1453  break;
1454  }
1455 
1456  // All other items are selected only if the layer on which they exist is visible
1457  return board()->IsLayerVisible( aItem->GetLayer() );
1458 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
bool IsElementVisible(GAL_LAYER_ID LAYER_aPCB) const
Function IsElementVisible tests whether a given element category is visible.
bool GetHighContrast() const
Function GetHighContrast Returns information about high contrast display mode.
Definition: painter.h:161
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Function IsOnLayer tests to see if this object is on the given layer.
bool m_multiple
Flag saying if multiple selection mode is active.
the 3d code uses this value
Definition: typeinfo.h:92
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Function ViewGetLayers() Returns the all the layers within the VIEW the object is painted on...
show modules on back
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:106
show modules on front
class MODULE, a footprint
Definition: typeinfo.h:101
PCB_LAYER_ID
A quick note on layer IDs:
static const int VIEW_MAX_LAYERS
maximum number of layers that may be shown
Definition: view.h:641
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:196
TOOL_SETTINGS & GetSettings()
Definition: tool_base.cpp:72
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:236
bool m_editModules
Definition: pcb_tool.h:128
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:105
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
bool IsVisible(const VIEW_ITEM *aItem) const
Returns information if the item is visible (or not).
Definition: view.cpp:1371
#define mod(a, n)
Definition: greymap.cpp:24
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:443
BOARD * board() const
Definition: pcb_tool.h:126
void SELECTION_TOOL::selectAllItemsConnectedToItem ( BOARD_CONNECTED_ITEM aSourceItem)
private

Selects all items connected (by copper) to the given item.

Definition at line 832 of file selection_tool.cpp.

References PCB_TOOL::board(), EOT, BOARD::GetConnectivity(), PCB_TRACE_T, PCB_VIA_T, and select().

Referenced by selectCopper().

833 {
834  constexpr KICAD_T types[] = { PCB_TRACE_T, PCB_VIA_T, EOT };
835  auto connectivity = board()->GetConnectivity();
836 
837  std::list<BOARD_CONNECTED_ITEM*> items;
838  items = connectivity->GetConnectedItems( &aSourceItem, types );
839 
840  for( auto item : connectivity->GetConnectedItems( &aSourceItem, types ) )
841  select( item );
842 }
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
search types array terminator (End Of Types)
Definition: typeinfo.h:94
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Function GetConnectivity() returns list of missing connections between components/tracks.
Definition: class_board.h:290
BOARD * board() const
Definition: pcb_tool.h:126
void SELECTION_TOOL::selectAllItemsConnectedToTrack ( TRACK aSourceTrack)
private

Selects all items connected by copper tracks to the given TRACK.

Definition at line 818 of file selection_tool.cpp.

References PCB_TOOL::board(), BOARD::MarkTrace(), TRACK::Next(), and select().

Referenced by selectConnection().

819 {
820  int segmentCount;
821  TRACK* trackList = board()->MarkTrace( &aSourceTrack, &segmentCount,
822  nullptr, nullptr, true );
823 
824  for( int i = 0; i < segmentCount; ++i )
825  {
826  select( trackList );
827  trackList = trackList->Next();
828  }
829 }
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
TRACK * MarkTrace(TRACK *aTrace, int *aCount, double *aTraceLength, double *aInPackageLength, bool aReorder)
Function MarkTrace marks a chain of trace segments, connected to aTrace.
TRACK * Next() const
Definition: class_track.h:98
BOARD * board() const
Definition: pcb_tool.h:126
void SELECTION_TOOL::selectAllItemsOnNet ( int  aNetCode)
private

Selects all items with the given net code.

Definition at line 845 of file selection_tool.cpp.

References PCB_TOOL::board(), EOT, BOARD::GetConnectivity(), PCB_TRACE_T, PCB_VIA_T, and select().

Referenced by selectNet().

846 {
847  constexpr KICAD_T types[] = { PCB_TRACE_T, PCB_VIA_T, EOT };
848  auto connectivity = board()->GetConnectivity();
849 
850  for( auto item : connectivity->GetNetItems( aNetCode, types ) )
851  select( item );
852 }
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
search types array terminator (End Of Types)
Definition: typeinfo.h:94
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Function GetConnectivity() returns list of missing connections between components/tracks.
Definition: class_board.h:290
BOARD * board() const
Definition: pcb_tool.h:126
void SELECTION_TOOL::selectAllItemsOnSheet ( wxString &  aSheetpath)
private

Selects all items with the given sheet timestamp name (the sheet path)

Definition at line 884 of file selection_tool.cpp.

References PCB_TOOL::board(), EOT, DLIST< T >::GetFirst(), BOARD::m_Modules, MODULE::Next(), PCB_TRACE_T, PCB_VIA_T, and select().

Referenced by selectOnSheetFromEeschema(), and selectSameSheet().

885 {
886  auto modules = board()->m_Modules.GetFirst();
887  std::list<MODULE*> modList;
888 
889  // store all modules that are on that sheet
890  for( MODULE* mitem = modules; mitem; mitem = mitem->Next() )
891  {
892  if( mitem != NULL && mitem->GetPath().Contains( aSheetpath ) )
893  {
894  modList.push_back( mitem );
895  }
896  }
897 
898  //Generate a list of all pads, and of all nets they belong to.
899  std::list<int> netcodeList;
900  for( MODULE* mmod : modList )
901  {
902  for( auto pad : mmod->Pads() )
903  {
904  if( pad->IsConnected() )
905  {
906  netcodeList.push_back( pad->GetNetCode() );
907  }
908  }
909  }
910 
911  // remove all duplicates
912  netcodeList.sort();
913  netcodeList.unique();
914 
915  // now we need to find all modules that are connected to each of these nets
916  // then we need to determine if these modules are in the list of modules
917  // belonging to this sheet ( modList )
918  //RN_DATA* ratsnest = getModel<BOARD>()->GetRatsnest();
919  std::list<int> removeCodeList;
920  for( int netCode : netcodeList )
921  {
922  std::list<BOARD_CONNECTED_ITEM*> netPads;
923 // fixme
924  // ratsnest->GetNetItems( netCode, netPads, (RN_ITEM_TYPE)( RN_PADS ) );
925  for( BOARD_CONNECTED_ITEM* mitem : netPads )
926  {
927  bool found = ( std::find( modList.begin(), modList.end(), mitem->GetParent() ) != modList.end() );
928  if( !found )
929  {
930  // if we cannot find the module of the pad in the modList
931  // then we can assume that that module is not located in the same
932  // schematic, therefore invalidate this netcode.
933  removeCodeList.push_back( netCode );
934  break;
935  }
936  }
937  }
938 
939  // remove all duplicates
940  removeCodeList.sort();
941  removeCodeList.unique();
942 
943  for( int removeCode : removeCodeList )
944  {
945  netcodeList.remove( removeCode );
946  }
947 
948  std::list<BOARD_CONNECTED_ITEM*> localConnectionList;
949  for( int netCode : netcodeList )
950  {
951  KICAD_T types[] = { PCB_TRACE_T, PCB_VIA_T, EOT };
952  for( auto item : board()->GetConnectivity()->GetNetItems( netCode, types ) )
953  {
954  localConnectionList.push_back( item );
955  }
956  }
957 
958  for( BOARD_ITEM* i : modList )
959  {
960  if( i != NULL )
961  select( i );
962  }
963  for( BOARD_CONNECTED_ITEM* i : localConnectionList )
964  {
965  if( i != NULL )
966  select( i );
967  }
968 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
MODULE * Next() const
Definition: class_module.h:100
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
search types array terminator (End Of Types)
Definition: typeinfo.h:94
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
T * GetFirst() const
Function GetFirst returns the first T* in the list without removing it, or NULL if the list is empty...
Definition: dlist.h:163
DLIST< MODULE > m_Modules
Definition: class_board.h:245
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
BOARD * board() const
Definition: pcb_tool.h:126
int SELECTION_TOOL::selectConnection ( const TOOL_EVENT aEvent)
private

Selects a trivial connection (between two junctions) of items in selection

Definition at line 763 of file selection_tool.cpp.

References SELECTION::GetItems(), m_selection, TOOL_BASE::m_toolMgr, PCB_TRACE_T, PCB_VIA_T, TOOL_MANAGER::ProcessEvent(), selectAllItemsConnectedToTrack(), selectCursor(), SelectedEvent, and SELECTION::Size().

Referenced by SetTransitions().

764 {
765  if( !selectCursor() )
766  return 0;
767 
768  // copy the selection, since we're going to iterate and modify
769  auto selection = m_selection.GetItems();
770 
771  for( auto item : selection )
772  {
773  // only TRACK items can be checked for trivial connections
774  if( item->Type() == PCB_TRACE_T || item->Type() == PCB_VIA_T )
775  {
776  TRACK& trackItem = static_cast<TRACK&>( *item );
777  selectAllItemsConnectedToTrack( trackItem );
778  }
779  }
780 
781  // Inform other potentially interested tools
782  if( m_selection.Size() > 0 )
784 
785  return 0;
786 }
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
const std::set< EDA_ITEM * > GetItems() const
Definition: selection.h:117
SELECTION m_selection
Current state of selection.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
void selectAllItemsConnectedToTrack(TRACK &aSourceTrack)
Selects all items connected by copper tracks to the given TRACK.
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
int SELECTION_TOOL::selectCopper ( const TOOL_EVENT aEvent)
private

Selects items with a continuous copper connection to items in selection

Definition at line 789 of file selection_tool.cpp.

References SELECTION::GetItems(), m_selection, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ProcessEvent(), selectAllItemsConnectedToItem(), selectCursor(), SelectedEvent, and SELECTION::Size().

Referenced by SetTransitions().

790 {
791  if( !selectCursor() )
792  return 0;
793 
794  // copy the selection, since we're going to iterate and modify
795  auto selection = m_selection.GetItems();
796 
797  for( auto i : selection )
798  {
799  auto item = static_cast<BOARD_ITEM*>( i );
800 
801  // only connected items can be traversed in the ratsnest
802  if( item->IsConnected() )
803  {
804  auto& connItem = static_cast<BOARD_CONNECTED_ITEM&>( *item );
805 
806  selectAllItemsConnectedToItem( connItem );
807  }
808  }
809 
810  // Inform other potentially interested tools
811  if( m_selection.Size() > 0 )
813 
814  return 0;
815 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
const std::set< EDA_ITEM * > GetItems() const
Definition: selection.h:117
SELECTION m_selection
Current state of selection.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
void selectAllItemsConnectedToItem(BOARD_CONNECTED_ITEM &aSourceItem)
Selects all items connected (by copper) to the given item.
bool SELECTION_TOOL::selectCursor ( bool  aSelectAlways = false)
private

Function selectCursor() Selects an item under the cursor unless there is something already selected or aSelectAlways is true.

Parameters
aSelectAlwaysforces to select an item even if there is an item already selected.
Returns
true if eventually there is an item selected, false otherwise.

Definition at line 470 of file selection_tool.cpp.

References clearSelection(), SELECTION::Empty(), TOOL_BASE::getViewControls(), m_selection, and selectPoint().

Referenced by CursorSelection(), Main(), selectConnection(), selectCopper(), selectNet(), and selectSameSheet().

471 {
472  if( aSelectAlways || m_selection.Empty() )
473  {
474  clearSelection();
475  selectPoint( getViewControls()->GetMousePosition() );
476  }
477 
478  return !m_selection.Empty();
479 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
bool selectPoint(const VECTOR2I &aWhere, bool aOnDrag=false)
Function selectPoint() Selects an item pointed by the parameter aWhere.
bool SELECTION_TOOL::selectionContains ( const VECTOR2I aPoint) const
private

Function selectionContains() Checks if the given point is placed within any of selected items' bounding box.

Returns
True if the given point is contained in any of selected items' bouding box.

Definition at line 1557 of file selection_tool.cpp.

References BOX2< Vec >::Contains(), TOOL_BASE::getView(), BOX2< Vec >::Inflate(), m_selection, KIGFX::VIEW::ToWorld(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Main().

1558 {
1559  const unsigned GRIP_MARGIN = 20;
1560  VECTOR2D margin = getView()->ToWorld( VECTOR2D( GRIP_MARGIN, GRIP_MARGIN ), false );
1561 
1562  // Check if the point is located within any of the currently selected items bounding boxes
1563  for( auto item : m_selection )
1564  {
1565  BOX2I itemBox = item->ViewBBox();
1566  itemBox.Inflate( margin.x, margin.y ); // Give some margin for gripping an item
1567 
1568  if( itemBox.Contains( aPoint ) )
1569  return true;
1570  }
1571 
1572  return false;
1573 }
bool Contains(const Vec &aPoint) const
Function Contains.
Definition: box2.h:139
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Function ToWorld() Converts a screen space point/vector to a point/vector in world space coordinates...
Definition: view.cpp:440
VECTOR2< double > VECTOR2D
Definition: vector2d.h:589
SELECTION m_selection
Current state of selection.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:266
int SELECTION_TOOL::SelectItem ( const TOOL_EVENT aEvent)

Item selection event handler.

Definition at line 709 of file selection_tool.cpp.

References TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), TOOL_MANAGER::ProcessEvent(), select(), and SelectedEvent.

Referenced by SetTransitions().

710 {
711  // Check if there is an item to be selected
712  BOARD_ITEM* item = aEvent.Parameter<BOARD_ITEM*>();
713 
714  if( item )
715  {
716  select( item );
717 
718  // Inform other potentially interested tools
720  }
721 
722  return 0;
723 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
int SELECTION_TOOL::SelectItems ( const TOOL_EVENT aEvent)

Multiple item selection event handler

Definition at line 689 of file selection_tool.cpp.

References TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), TOOL_MANAGER::ProcessEvent(), select(), and SelectedEvent.

Referenced by SetTransitions().

690 {
691  std::vector<BOARD_ITEM*>* items = aEvent.Parameter<std::vector<BOARD_ITEM*>*>();
692 
693  if( items )
694  {
695  // Perform individual selection of each item
696  // before processing the event.
697  for( auto item : *items )
698  {
699  select( item );
700  }
701 
703  }
704 
705  return 0;
706 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
bool SELECTION_TOOL::selectMultiple ( )
private

Function selectMultiple() Handles drawing a selection box that allows to select many items at the same time.

Returns
true if the function was cancelled (i.e. CancelEvent was received).

Definition at line 482 of file selection_tool.cpp.

References KIGFX::VIEW::Add(), BUT_LEFT, BOX2< Vec >::Contains(), SELECTION::Empty(), SELECTION::Front(), KIGFX::PREVIEW::SELECTION_AREA::GetEnd(), KIGFX::PREVIEW::SELECTION_AREA::GetOrigin(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), BOARD_ITEM::HitTest(), m_additive, m_frame, m_multiple, m_selection, m_subtractive, TOOL_BASE::m_toolMgr, EDA_RECT::Normalize(), TOOL_MANAGER::ProcessEvent(), KIGFX::VIEW::Query(), KIGFX::VIEW::Remove(), select(), selectable(), SelectedEvent, KIGFX::PREVIEW::SELECTION_AREA::SetAdditive(), KIGFX::VIEW_CONTROLS::SetAutoPan(), PCB_BASE_FRAME::SetCurItem(), KIGFX::PREVIEW::SELECTION_AREA::SetEnd(), KIGFX::PREVIEW::SELECTION_AREA::SetOrigin(), KIGFX::PREVIEW::SELECTION_AREA::SetSubtractive(), KIGFX::VIEW::SetVisible(), SELECTION::Size(), unselect(), KIGFX::VIEW::Update(), PCB_TOOL::view(), KIGFX::PREVIEW::SELECTION_AREA::ViewBBox(), EDA_ITEM::ViewBBox(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Main().

483 {
484  bool cancelled = false; // Was the tool cancelled while it was running?
485  m_multiple = true; // Multiple selection mode is active
486  KIGFX::VIEW* view = getView();
487  getViewControls()->SetAutoPan( true );
488 
490  view->Add( &area );
491 
492  while( OPT_TOOL_EVENT evt = Wait() )
493  {
494  if( evt->IsCancel() )
495  {
496  cancelled = true;
497  break;
498  }
499 
500  if( evt->IsDrag( BUT_LEFT ) )
501  {
502 
503  // Start drawing a selection box
504  area.SetOrigin( evt->DragOrigin() );
505  area.SetEnd( evt->Position() );
506  area.SetAdditive( m_additive );
508 
509  view->SetVisible( &area, true );
510  view->Update( &area );
511  }
512 
513  if( evt->IsMouseUp( BUT_LEFT ) )
514  {
515  // End drawing the selection box
516  view->SetVisible( &area, false );
517 
518  // Mark items within the selection box as selected
519  std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
520 
521  // Filter the view items based on the selection box
522  BOX2I selectionBox = area.ViewBBox();
523  view->Query( selectionBox, selectedItems ); // Get the list of selected items
524 
525  std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR>::iterator it, it_end;
526 
527  int width = area.GetEnd().x - area.GetOrigin().x;
528  int height = area.GetEnd().y - area.GetOrigin().y;
529 
530  // Construct an EDA_RECT to determine BOARD_ITEM selection
531  EDA_RECT selectionRect( wxPoint( area.GetOrigin().x, area.GetOrigin().y ),
532  wxSize( width, height ) );
533 
534  selectionRect.Normalize();
535 
536  for( it = selectedItems.begin(), it_end = selectedItems.end(); it != it_end; ++it )
537  {
538  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first );
539 
540  if( !item || !selectable( item ) )
541  continue;
542 
543  /* Selection mode depends on direction of drag-selection:
544  * Left > Right : Select objects that are fully enclosed by selection
545  * Right > Left : Select objects that are crossed by selection
546  */
547 
548  if( width >= 0 )
549  {
550  if( selectionBox.Contains( item->ViewBBox() ) )
551  {
552  if( m_subtractive )
553  unselect( item );
554  else
555  select( item );
556  }
557  }
558  else
559  {
560  if( item->HitTest( selectionRect, false ) )
561  {
562  if( m_subtractive )
563  unselect( item );
564  else
565  select( item );
566  }
567 
568  }
569  }
570 
571  if( m_selection.Size() == 1 )
572  m_frame->SetCurItem( static_cast<BOARD_ITEM*>( m_selection.Front() ) );
573  else
574  m_frame->SetCurItem( NULL );
575 
576  // Inform other potentially interested tools
577  if( !m_selection.Empty() )
579 
580  break; // Stop waiting for events
581  }
582  }
583 
584  // Stop drawing the selection box
585  view->Remove( &area );
586  m_multiple = false; // Multiple selection mode is inactive
587  getViewControls()->SetAutoPan( false );
588 
589  return cancelled;
590 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
void SetEnd(VECTOR2I aEnd)
Set the current end of the rectangle (the corner that moves with the cursor.
int Query(const BOX2I &aRect, std::vector< LAYER_ITEM_PAIR > &aResult) const
Function Query() Finds all visible items that touch or are within the rectangle aRect.
Definition: view.cpp:417
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
bool m_multiple
Flag saying if multiple selection mode is active.
void SetOrigin(VECTOR2I aOrigin)
Set the origin of the rectange (the fixed corner)
bool m_additive
Flag saying if items should be added to the current selection or rather replace it.
bool Contains(const Vec &aPoint) const
Function Contains.
Definition: box2.h:139
EDA_ITEM * Front() const
Definition: selection.h:144
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
bool selectable(const BOARD_ITEM *aItem) const
Function selectable() Checks conditions for an item to be selected.
const BOX2I ViewBBox() const override
Function ViewBBox() returns the bounding box of the item covering all its layers. ...
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
void Normalize()
Function Normalize ensures that the height ant width are positive.
bool m_subtractive
Flag saying if items should be removed from the current selection.
virtual bool HitTest(const wxPoint &aPosition) const override
Function HitTest tests if aPosition is contained within or on the bounding area of an item...
void SetSubtractive(bool aSubtractive)
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
Class EDA_RECT handles the component boundary box.
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1331
Class SELECTION_AREA.
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
Class VIEW.
Definition: view.h:58
virtual const BOX2I ViewBBox() const override
Function ViewBBox() returns the bounding box of the item covering all its layers. ...
void SetAdditive(bool aAdditive)
int SELECTION_TOOL::selectNet ( const TOOL_EVENT aEvent)
private

Selects all copper connections belonging to the same net(s) as the items in the selection.

Definition at line 855 of file selection_tool.cpp.

References SELECTION::GetItems(), m_selection, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ProcessEvent(), selectAllItemsOnNet(), selectCursor(), SelectedEvent, and SELECTION::Size().

Referenced by SetTransitions().

856 {
857  if( !selectCursor() )
858  return 0;
859 
860  // copy the selection, since we're going to iterate and modify
861  auto selection = m_selection.GetItems();
862 
863  for( auto i : selection )
864  {
865  auto item = static_cast<BOARD_ITEM*>( i );
866 
867  // only connected items get a net code
868  if( item->IsConnected() )
869  {
870  auto& connItem = static_cast<BOARD_CONNECTED_ITEM&>( *item );
871 
872  selectAllItemsOnNet( connItem.GetNetCode() );
873  }
874  }
875 
876  // Inform other potentially interested tools
877  if( m_selection.Size() > 0 )
879 
880  return 0;
881 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
const std::set< EDA_ITEM * > GetItems() const
Definition: selection.h:117
void selectAllItemsOnNet(int aNetCode)
Selects all items with the given net code.
SELECTION m_selection
Current state of selection.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
int SELECTION_TOOL::selectOnSheetFromEeschema ( const TOOL_EVENT aEvent)
private

Selects all modules belonging to same sheet, from Eeschema, using crossprobing

Definition at line 993 of file selection_tool.cpp.

References clearSelection(), m_selection, TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), TOOL_MANAGER::ProcessEvent(), selectAllItemsOnSheet(), SelectedEvent, SELECTION::Size(), and zoomFitSelection().

Referenced by SetTransitions().

994 {
995  clearSelection();
996  wxString* sheetpath = aEvent.Parameter<wxString*>();
997 
998  selectAllItemsOnSheet( *sheetpath );
999 
1000  zoomFitSelection();
1001 
1002  if( m_selection.Size() > 0 )
1004 
1005  return 0;
1006 }
void zoomFitSelection(void)
Zooms the screen to center and fit the current selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void selectAllItemsOnSheet(wxString &aSheetpath)
Selects all items with the given sheet timestamp name (the sheet path)
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
bool SELECTION_TOOL::selectPoint ( const VECTOR2I aWhere,
bool  aOnDrag = false 
)
private

Function selectPoint() Selects an item pointed by the parameter aWhere.

If there is more than one item at that place, there is a menu displayed that allows to choose the item.

Parameters
aWhereis the place where the item should be selected.
aAllowDisambiguationdecides what to do in case of disambiguation. If true, then a menu is shown, otherise function finishes without selecting anything.
Returns
True if an item was selected, false otherwise.

Definition at line 406 of file selection_tool.cpp.

References GENERAL_COLLECTOR::AllBoardItems, PCB_TOOL::board(), BUT_LEFT, clearSelection(), GENERAL_COLLECTOR::Collect(), disambiguationMenu(), PCB_BASE_FRAME::GetCollectorsGuide(), COLLECTOR::GetCount(), guessSelectionCandidates(), m_additive, PCB_TOOL::m_editModules, m_frame, GENERAL_COLLECTOR::ModuleItems, COLLECTOR::Remove(), selectable(), TA_MOUSE_UP, TC_ANY, toggleSelection(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Main(), and selectCursor().

407 {
408  BOARD_ITEM* item;
410  GENERAL_COLLECTOR collector;
411 
412  collector.Collect( board(),
414  wxPoint( aWhere.x, aWhere.y ), guide );
415 
416  bool anyCollected = collector.GetCount() != 0;
417 
418  // Remove unselectable items
419  for( int i = collector.GetCount() - 1; i >= 0; --i )
420  {
421  if( !selectable( collector[i] ) || ( aOnDrag && collector[i]->IsLocked() ) )
422  collector.Remove( i );
423  }
424 
425  switch( collector.GetCount() )
426  {
427  case 0:
428  if( !m_additive && anyCollected )
429  clearSelection();
430 
431  return false;
432 
433  case 1:
434  toggleSelection( collector[0] );
435 
436  return true;
437 
438  default:
439  // Apply some ugly heuristics to avoid disambiguation menus whenever possible
440  guessSelectionCandidates( collector );
441 
442  // Let's see if there is still disambiguation in selection..
443  if( collector.GetCount() == 1 )
444  {
445  toggleSelection( collector[0] );
446 
447  return true;
448  }
449  else if( collector.GetCount() > 1 )
450  {
451  if( aOnDrag )
453 
454  item = disambiguationMenu( &collector );
455 
456  if( item )
457  {
458  toggleSelection( item );
459 
460  return true;
461  }
462  }
463  break;
464  }
465 
466  return false;
467 }
int GetCount() const
Function GetCount returns the number of objects in the list.
static const KICAD_T AllBoardItems[]
A scan list for all editable board items, like PcbGeneralLocateAndDisplay()
Definition: collectors.h:241
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
void Collect(BOARD_ITEM *aItem, const KICAD_T aScanList[], const wxPoint &aRefPos, const COLLECTORS_GUIDE &aGuide)
Function Collect scans a BOARD_ITEM using this class's Inspector method, which does the collection...
Definition: collectors.cpp:447
void guessSelectionCandidates(GENERAL_COLLECTOR &aCollector) const
Function guessSelectionCandidates() Tries to guess best selection candidates in case multiple items a...
bool m_additive
Flag saying if items should be added to the current selection or rather replace it.
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
Function GetCollectorsGuide.
bool selectable(const BOARD_ITEM *aItem) const
Function selectable() Checks conditions for an item to be selected.
void toggleSelection(BOARD_ITEM *aItem)
Function toggleSelection() Changes selection status of a given item.
Class TOOL_EVENT.
Definition: tool_event.h:162
BOARD_ITEM * disambiguationMenu(GENERAL_COLLECTOR *aItems)
Function disambiguationMenu() Handles the menu that allows to select one of many items in case there ...
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
bool m_editModules
Definition: pcb_tool.h:128
static const KICAD_T ModuleItems[]
A scan list for primary module items.
Definition: collectors.h:288
Class GENERAL_COLLECTOR is intended for use when the right click button is pressed, or when the plain "arrow" tool is in effect.
Definition: collectors.h:211
Class GENERAL_COLLECTORS_GUIDE is a general implementation of a COLLECTORS_GUIDE. ...
Definition: collectors.h:378
BOARD * board() const
Definition: pcb_tool.h:126
int SELECTION_TOOL::selectSameSheet ( const TOOL_EVENT aEvent)
private

Selects all modules belonging to same hierarchical sheet as the selected footprint.

Definition at line 1009 of file selection_tool.cpp.

References clearSelection(), SELECTION::Front(), m_selection, TOOL_BASE::m_toolMgr, mod, PCB_MODULE_T, TOOL_MANAGER::ProcessEvent(), selectAllItemsOnSheet(), selectCursor(), SelectedEvent, and SELECTION::Size().

Referenced by SetTransitions().

1010 {
1011  if( !selectCursor( true ) )
1012  return 0;
1013 
1014  // this function currently only supports modules since they are only
1015  // on one sheet.
1016  auto item = m_selection.Front();
1017 
1018  if( !item )
1019  return 0;
1020 
1021  if( item->Type() != PCB_MODULE_T )
1022  return 0;
1023 
1024  auto mod = dynamic_cast<MODULE*>( item );
1025 
1026  clearSelection();
1027 
1028  // get the lowest subsheet name for this.
1029  wxString sheetPath = mod->GetPath();
1030  sheetPath = sheetPath.BeforeLast( '/' );
1031  sheetPath = sheetPath.AfterLast( '/' );
1032 
1033  selectAllItemsOnSheet( sheetPath );
1034 
1035  // Inform other potentially interested tools
1036  if( m_selection.Size() > 0 )
1038 
1039  return 0;
1040 }
bool selectCursor(bool aSelectAlways=false)
Function selectCursor() Selects an item under the cursor unless there is something already selected o...
EDA_ITEM * Front() const
Definition: selection.h:144
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
class MODULE, a footprint
Definition: typeinfo.h:101
void selectAllItemsOnSheet(wxString &aSheetpath)
Selects all items with the given sheet timestamp name (the sheet path)
SELECTION m_selection
Current state of selection.
void clearSelection()
Function clearSelection() Clears the current selection.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
#define mod(a, n)
Definition: greymap.cpp:24
void SELECTION_TOOL::selectVisually ( BOARD_ITEM aItem)
private

Function selectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST.

Parameters
aItemis an item to be be marked.

Definition at line 1509 of file selection_tool.cpp.

References KIGFX::GEOMETRY, KIGFX::VIEW::Hide(), m_selection, PCB_MODULE_T, EDA_ITEM::SetSelected(), EDA_ITEM::Type(), KIGFX::VIEW::Update(), and PCB_TOOL::view().

Referenced by select().

1510 {
1511  // Hide the original item, so it is shown only on overlay
1512  aItem->SetSelected();
1513  view()->Hide( aItem, true );
1514  view()->Update( aItem, KIGFX::GEOMETRY );
1515 
1516  // Modules are treated in a special way - when they are selected, we have to
1517  // unselect all the parts that make the module, not the module itself
1518 
1519  if( aItem->Type() == PCB_MODULE_T )
1520  {
1521  static_cast<MODULE*>( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item )
1522  {
1523  item->SetSelected();
1524  view()->Hide( item, true );
1525  view()->Update( item, KIGFX::GEOMETRY );
1526  } );
1527  }
1528 
1529  view()->Update( &m_selection );
1530 }
void Hide(VIEW_ITEM *aItem, bool aHide=true)
Temporarily hides the item in the view (e.g.
Definition: view.cpp:1352
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
class MODULE, a footprint
Definition: typeinfo.h:101
void SetSelected()
Definition: base_struct.h:227
SELECTION m_selection
Current state of selection.
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
Color has changed.
Definition: view_item.h:57
void TOOL_INTERACTIVE::SetContextMenu ( CONTEXT_MENU aMenu,
CONTEXT_MENU_TRIGGER  aTrigger = CMENU_BUTTON 
)
inherited

Function SetContextMenu()

Assigns a context menu and tells when it should be activated.

Parameters
aMenuis the menu to be assigned.
aTriggerdetermines conditions upon which the context menu is activated.

Definition at line 67 of file tool_interactive.cpp.

References CMENU_OFF, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ScheduleContextMenu(), and CONTEXT_MENU::SetTool().

Referenced by disambiguationMenu(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), and TOOL_MENU::ShowContextMenu().

68 {
69  if( aMenu )
70  aMenu->SetTool( this );
71  else
72  aTrigger = CMENU_OFF;
73 
74  m_toolMgr->ScheduleContextMenu( this, aMenu, aTrigger );
75 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void ScheduleContextMenu(TOOL_BASE *aTool, CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger)
Sets behaviour of the tool's context popup menu.
void SetTool(TOOL_INTERACTIVE *aTool)
Function SetTool() Sets a tool that is the creator of the menu.
void PCB_TOOL::SetEditModules ( bool  aEnabled)
inlineinherited

Function SetEditModules()

Toggles edit module mode. When enabled, one may select parts of modules individually (graphics, pads, etc.), so they can be modified.

Parameters
aEnableddecides if the mode should be enabled.

Definition at line 86 of file pcb_tool.h.

References PCB_TOOL::m_editModules.

87  {
88  m_editModules = aEnabled;
89  }
bool m_editModules
Definition: pcb_tool.h:128
void SELECTION_TOOL::SetTransitions ( )
overridevirtual

Sets up handlers for various events.

Reimplemented from TOOL_BASE.

Definition at line 593 of file selection_tool.cpp.

References ClearSelection(), CursorSelection(), PCB_ACTIONS::filterSelection, filterSelection(), find(), PCB_ACTIONS::find, findMove(), PCB_ACTIONS::findMove, TOOL_INTERACTIVE::Go(), Main(), PCB_ACTIONS::selectConnection, selectConnection(), PCB_ACTIONS::selectCopper, selectCopper(), PCB_ACTIONS::selectionActivate, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionCursor, PCB_ACTIONS::selectionModified, PCB_ACTIONS::selectItem, SelectItem(), PCB_ACTIONS::selectItems, SelectItems(), PCB_ACTIONS::selectNet, selectNet(), PCB_ACTIONS::selectOnSheetFromEeschema, selectOnSheetFromEeschema(), PCB_ACTIONS::selectSameSheet, selectSameSheet(), PCB_ACTIONS::unselectItem, UnselectItem(), PCB_ACTIONS::unselectItems, UnselectItems(), and updateSelection().

594 {
602  Go( &SELECTION_TOOL::find, PCB_ACTIONS::find.MakeEvent() );
611 }
static TOOL_ACTION selectItems
Selects a list of items (specified as the event parameter)
Definition: pcb_actions.h:59
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: pcb_actions.h:47
int UnselectItem(const TOOL_EVENT &aEvent)
Item unselection event handler.
int Main(const TOOL_EVENT &aEvent)
Function Main()
int selectSameSheet(const TOOL_EVENT &aEvent)
Selects all modules belonging to same hierarchical sheet as the selected footprint.
static TOOL_ACTION unselectItem
Unselects an item (specified as the event parameter).
Definition: pcb_actions.h:62
static TOOL_ACTION selectNet
Selects all connections belonging to a single net.
Definition: pcb_actions.h:74
static TOOL_ACTION unselectItems
Unselects a list of items (specified as the event parameter)
Definition: pcb_actions.h:65
int find(const TOOL_EVENT &aEvent)
Find an item.
int findMove(const TOOL_EVENT &aEvent)
Find an item and start moving.
int UnselectItems(const TOOL_EVENT &aEvent)
Multiple item unselection event handler
static TOOL_ACTION selectConnection
Selects a connection between junctions.
Definition: pcb_actions.h:68
int selectConnection(const TOOL_EVENT &aEvent)
Selects a trivial connection (between two junctions) of items in selection
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
int selectCopper(const TOOL_EVENT &aEvent)
Selects items with a continuous copper connection to items in selection
int filterSelection(const TOOL_EVENT &aEvent)
Invoke filter dialog and modify current selection
static TOOL_ACTION find
Find an item.
Definition: pcb_actions.h:366
int updateSelection(const TOOL_EVENT &aEvent)
Event handler to update the selection VIEW_ITEM.
int ClearSelection(const TOOL_EVENT &aEvent)
Clear current selection event handler.
int selectOnSheetFromEeschema(const TOOL_EVENT &aEvent)
Selects all modules belonging to same sheet, from Eeschema, using crossprobing
static TOOL_ACTION selectCopper
Selects whole copper connection.
Definition: pcb_actions.h:71
int SelectItem(const TOOL_EVENT &aEvent)
Item selection event handler.
int selectNet(const TOOL_EVENT &aEvent)
Selects all copper connections belonging to the same net(s) as the items in the selection.
static TOOL_ACTION filterSelection
Filters the items in the current selection (invokes dialog)
Definition: pcb_actions.h:83
static TOOL_ACTION selectOnSheetFromEeschema
Selects all components on sheet from Eeschema crossprobing.
Definition: pcb_actions.h:77
static TOOL_ACTION selectItem
Selects an item (specified as the event parameter).
Definition: pcb_actions.h:56
int SelectItems(const TOOL_EVENT &aEvent)
Multiple item selection event handler
static TOOL_ACTION findMove
Find an item and start moving.
Definition: pcb_actions.h:369
int CursorSelection(const TOOL_EVENT &aEvent)
Select a single item under cursor event handler.
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
Definition: pcb_actions.h:50
static TOOL_ACTION selectSameSheet
Selects all components on the same sheet as the selected footprint.
Definition: pcb_actions.h:80
void SELECTION_TOOL::toggleSelection ( BOARD_ITEM aItem)
private

Function toggleSelection() Changes selection status of a given item.

Parameters
aItemis the item to have selection status changed.

Definition at line 378 of file selection_tool.cpp.

References clearSelection(), EDA_DRAW_PANEL_GAL::ForceRefresh(), EDA_DRAW_FRAME::GetGalCanvas(), EDA_ITEM::IsSelected(), m_additive, m_frame, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ProcessEvent(), select(), selectable(), SelectedEvent, unselect(), and UnselectedEvent.

Referenced by findMove(), and selectPoint().

379 {
380  if( aItem->IsSelected() )
381  {
382  unselect( aItem );
383 
384  // Inform other potentially interested tools
386  }
387  else
388  {
389  if( !m_additive )
390  clearSelection();
391 
392  // Prevent selection of invisible or inactive items
393  if( selectable( aItem ) )
394  {
395  select( aItem );
396 
397  // Inform other potentially interested tools
399  }
400  }
401 
403 }
void ForceRefresh()
Function ForceRefresh() Forces a redraw.
bool m_additive
Flag saying if items should be added to the current selection or rather replace it.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool IsSelected() const
Definition: base_struct.h:221
void select(BOARD_ITEM *aItem)
Function select() Takes necessary action mark an item as selected.
bool selectable(const BOARD_ITEM *aItem) const
Function selectable() Checks conditions for an item to be selected.
void clearSelection()
Function clearSelection() Clears the current selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
static const TOOL_EVENT UnselectedEvent
Event sent after an item is unselected.
static const TOOL_EVENT SelectedEvent
Event sent after an item is selected.
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
EDA_DRAW_PANEL_GAL * GetGalCanvas() const
Function GetGalCanvas returns a pointer to GAL-based canvas of given EDA draw frame.
Definition: draw_frame.h:817
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
void SELECTION_TOOL::unselect ( BOARD_ITEM aItem)
private

Function unselect() Takes necessary action mark an item as unselected.

Parameters
aItemis an item to be unselected.

Definition at line 1493 of file selection_tool.cpp.

References SELECTION::Empty(), EDA_ITEM::IsSelected(), m_frame, m_locked, m_selection, SELECTION::Remove(), PCB_BASE_FRAME::SetCurItem(), and unselectVisually().

Referenced by RequestSelection(), SanitizeSelection(), selectMultiple(), toggleSelection(), UnselectItem(), and UnselectItems().

1494 {
1495  if( !aItem->IsSelected() )
1496  return;
1497 
1498  m_selection.Remove( aItem );
1499  unselectVisually( aItem );
1500 
1501  if( m_selection.Empty() )
1502  {
1503  m_frame->SetCurItem( NULL );
1504  m_locked = true;
1505  }
1506 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
bool IsSelected() const
Definition: base_struct.h:221
void unselectVisually(BOARD_ITEM *aItem)
Function unselectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST.
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
bool m_locked
Can other tools modify locked items.
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
int SELECTION_TOOL::UnselectItem ( const TOOL_EVENT aEvent)

Item unselection event handler.

Definition at line 746 of file selection_tool.cpp.

References TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), TOOL_MANAGER::ProcessEvent(), unselect(), and UnselectedEvent.

Referenced by SetTransitions().

747 {
748  // Check if there is an item to be selected
749  BOARD_ITEM* item = aEvent.Parameter<BOARD_ITEM*>();
750 
751  if( item )
752  {
753  unselect( item );
754 
755  // Inform other potentially interested tools
757  }
758 
759  return 0;
760 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
static const TOOL_EVENT UnselectedEvent
Event sent after an item is unselected.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
int SELECTION_TOOL::UnselectItems ( const TOOL_EVENT aEvent)

Multiple item unselection event handler

Definition at line 726 of file selection_tool.cpp.

References TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), TOOL_MANAGER::ProcessEvent(), unselect(), and UnselectedEvent.

Referenced by SetTransitions().

727 {
728  std::vector<BOARD_ITEM*>* items = aEvent.Parameter<std::vector<BOARD_ITEM*>*>();
729 
730  if( items )
731  {
732  // Perform individual unselection of each item
733  // before processing the event
734  for( auto item : *items )
735  {
736  unselect( item );
737  }
738 
740  }
741 
742  return 0;
743 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
static const TOOL_EVENT UnselectedEvent
Event sent after an item is unselected.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
void unselect(BOARD_ITEM *aItem)
Function unselect() Takes necessary action mark an item as unselected.
void ProcessEvent(const TOOL_EVENT &aEvent)
Propagates an event to tools that requested events of matching type(s).
void SELECTION_TOOL::unselectVisually ( BOARD_ITEM aItem)
private

Function unselectVisually() Marks item as selected, but does not add it to the ITEMS_PICKED_LIST.

Parameters
aItemis an item to be be marked.

Definition at line 1533 of file selection_tool.cpp.

References KIGFX::ALL, EDA_ITEM::ClearSelected(), KIGFX::VIEW::Hide(), m_selection, PCB_MODULE_T, EDA_ITEM::Type(), KIGFX::VIEW::Update(), and PCB_TOOL::view().

Referenced by clearSelection(), and unselect().

1534 {
1535  // Restore original item visibility
1536  aItem->ClearSelected();
1537  view()->Hide( aItem, false );
1538  view()->Update( aItem, KIGFX::ALL );
1539 
1540  // Modules are treated in a special way - when they are selected, we have to
1541  // unselect all the parts that make the module, not the module itself
1542 
1543  if( aItem->Type() == PCB_MODULE_T )
1544  {
1545  static_cast<MODULE*>( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item )
1546  {
1547  item->ClearSelected();
1548  view()->Hide( item, false );
1549  view()->Update( item, KIGFX::ALL );
1550  });
1551  }
1552 
1553  view()->Update( &m_selection );
1554 }
void Hide(VIEW_ITEM *aItem, bool aHide=true)
Temporarily hides the item in the view (e.g.
Definition: view.cpp:1352
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
void ClearSelected()
Definition: base_struct.h:231
Layers have changed.
Definition: view_item.h:59
class MODULE, a footprint
Definition: typeinfo.h:101
SELECTION m_selection
Current state of selection.
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
int SELECTION_TOOL::updateSelection ( const TOOL_EVENT aEvent)
private

Event handler to update the selection VIEW_ITEM.

Definition at line 1876 of file selection_tool.cpp.

References TOOL_BASE::getView(), m_selection, and KIGFX::VIEW::Update().

Referenced by SetTransitions().

1877 {
1878  getView()->Update( &m_selection );
1879 
1880  return 0;
1881 }
SELECTION m_selection
Current state of selection.
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
OPT_TOOL_EVENT TOOL_INTERACTIVE::Wait ( const TOOL_EVENT_LIST aEventList = TOOL_EVENTTC_ANYTA_ANY ))
inherited

Function Wait()

Suspends execution of the tool until an event specified in aEventList arrives. No parameters means waiting for any event.

Definition at line 55 of file tool_interactive.cpp.

References TOOL_BASE::m_toolMgr, and TOOL_MANAGER::ScheduleWait().

Referenced by MODULE_EDITOR_TOOLS::CopyItems(), PCBNEW_CONTROL::DeleteItemCursor(), disambiguationMenu(), PCB_TOOL::doInteractiveItemPlacement(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::InlineDrag(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), DRAWING_TOOL::PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), DRAWING_TOOL::runPolygonEventLoop(), selectMultiple(), selectPoint(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), ZOOM_TOOL::selectRegion(), DRAWING_TOOL::SetAnchor(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

56 {
57  return m_toolMgr->ScheduleWait( this, aEventList );
58 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
boost::optional< TOOL_EVENT > ScheduleWait(TOOL_BASE *aTool, const TOOL_EVENT_LIST &aConditions)
Pauses execution of a given tool until one or more events matching aConditions arrives.
void SELECTION_TOOL::zoomFitSelection ( void  )

Zooms the screen to center and fit the current selection.

Definition at line 970 of file selection_tool.cpp.

References KIGFX::VIEW::Add(), EDA_DRAW_PANEL_GAL::ForceRefresh(), EDA_DRAW_FRAME::GetGalCanvas(), KIGFX::VIEW::GetScale(), TOOL_BASE::getView(), m_frame, m_selection, max, scale, KIGFX::VIEW::SetCenter(), KIGFX::VIEW::SetScale(), KIGFX::VIEW::ToWorld(), PCB_TOOL::view(), SELECTION::ViewBBox(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by selectOnSheetFromEeschema().

971 {
972  //Should recalculate the view to zoom in on the selection
973  auto selectionBox = m_selection.ViewBBox();
974  auto canvas = m_frame->GetGalCanvas();
975  auto view = getView();
976 
977  VECTOR2D screenSize = view->ToWorld( canvas->GetClientSize(), false );
978 
979  if( !( selectionBox.GetWidth() == 0 ) || !( selectionBox.GetHeight() == 0 ) )
980  {
981  VECTOR2D vsize = selectionBox.GetSize();
982  double scale = view->GetScale() / std::max( fabs( vsize.x / screenSize.x ),
983  fabs( vsize.y / screenSize.y ) );
984  view->SetScale( scale );
985  view->SetCenter( selectionBox.Centre() );
986  view->Add( &m_selection );
987  }
988 
990 }
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
void ForceRefresh()
Function ForceRefresh() Forces a redraw.
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Function ToWorld() Converts a screen space point/vector to a point/vector in world space coordinates...
Definition: view.cpp:440
void SetScale(double aScale)
Function SetScale() Sets the scaling factor.
Definition: view.h:247
const BOX2I ViewBBox() const override
Function ViewBBox() Returns the bounding box for all stored items covering all its layers...
void SetCenter(const VECTOR2D &aCenter)
Function SetCenter() Sets the center point of the VIEW (i.e.
Definition: view.cpp:564
SELECTION m_selection
Current state of selection.
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
const int scale
#define max(a, b)
Definition: auxiliary.h:86
double GetScale() const
Function GetScale()
Definition: view.h:265
EDA_DRAW_PANEL_GAL * GetGalCanvas() const
Function GetGalCanvas returns a pointer to GAL-based canvas of given EDA draw frame.
Definition: draw_frame.h:817
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311

Member Data Documentation

const TOOL_EVENT SELECTION_TOOL::ClearedEvent
static

Event sent after selection is cleared.

Definition at line 133 of file selection_tool.h.

Referenced by clearSelection(), and POINT_EDITOR::OnSelectionChange().

bool SELECTION_TOOL::m_additive
private

Flag saying if items should be added to the current selection or rather replace it.

Definition at line 330 of file selection_tool.h.

Referenced by Main(), selectMultiple(), selectPoint(), and toggleSelection().

bool SELECTION_TOOL::m_locked
private

Can other tools modify locked items.

Definition at line 339 of file selection_tool.h.

Referenced by CheckLock(), clearSelection(), Reset(), and unselect().

TOOL_MENU SELECTION_TOOL::m_menu
private

Menu model displayed by the tool.

Definition at line 342 of file selection_tool.h.

Referenced by GetToolMenu(), Init(), and Main().

bool SELECTION_TOOL::m_multiple
private

Flag saying if multiple selection mode is active.

Definition at line 336 of file selection_tool.h.

Referenced by selectable(), and selectMultiple().

std::unique_ptr<PRIV> SELECTION_TOOL::m_priv
private

Definition at line 345 of file selection_tool.h.

Referenced by filterSelection().

bool SELECTION_TOOL::m_subtractive
private

Flag saying if items should be removed from the current selection.

Definition at line 333 of file selection_tool.h.

Referenced by Main(), and selectMultiple().

TOOL_ID TOOL_BASE::m_toolId
protectedinherited

Unique identifier for the tool, assigned by a TOOL_MANAGER instance.

Definition at line 215 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), TOOL_BASE::GetId(), and EDIT_TOOL::getModificationPoint().

TOOL_MANAGER* TOOL_BASE::m_toolMgr
protectedinherited

Definition at line 220 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PCBNEW_CONTROL::AppendBoard(), PAD_TOOL::applyPadSettings(), TOOL_BASE::attachManager(), clearSelection(), MODULE_EDITOR_TOOLS::CopyItems(), PAD_TOOL::copyPadSettings(), PCB_EDITOR_CONTROL::CrossProbePcbToSch(), PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), PCBNEW_CONTROL::CursorControl(), ROUTER_TOOL::CustomTrackWidthDialog(), PCBNEW_CONTROL::DeleteItemCursor(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::drawZone(), PCB_EDITOR_CONTROL::DrillOrigin(), EDIT_TOOL::Duplicate(), EDIT_TOOL::editFootprintInFpEditor(), MODULE_EDITOR_TOOLS::EnumeratePads(), EDIT_TOOL::ExchangeFootprints(), findCallback(), findMove(), EDIT_TOOL::Flip(), TOOL_BASE::getEditFrameInt(), TOOL_BASE::GetManager(), TOOL_BASE::getModelInt(), EDIT_TOOL::getModificationPoint(), DRAWING_TOOL::getSourceZoneForAction(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_INTERACTIVE::goInternal(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::Init(), ALIGN_DISTRIBUTE_TOOL::Init(), PAD_TOOL::Init(), POINT_EDITOR::Init(), PCB_EDITOR_CONTROL::Init(), EDIT_TOOL::Init(), POSITION_RELATIVE_TOOL::Init(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::invokeInlineRouter(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::Mirror(), PCB_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), DRAWING_TOOL::PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), EDIT_TOOL::Remove(), RequestSelection(), EDIT_TOOL::Rotate(), TOOL_INTERACTIVE::RunMainStack(), SanitizeSelection(), selectConnection(), selectCopper(), SelectItem(), SelectItems(), selectMultiple(), selectNet(), selectOnSheetFromEeschema(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), selectSameSheet(), TOOL_INTERACTIVE::SetContextMenu(), PCB_EDITOR_CONTROL::ShowLocalRatsnest(), toggleSelection(), PCB_EDITOR_CONTROL::TrackWidthDec(), PCB_EDITOR_CONTROL::TrackWidthInc(), UnselectItem(), UnselectItems(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), TOOL_INTERACTIVE::Wait(), PCB_EDITOR_CONTROL::ZoneDuplicate(), PCB_EDITOR_CONTROL::ZoneFill(), PCB_EDITOR_CONTROL::ZoneMerge(), and PCB_EDITOR_CONTROL::ZoneUnfill().

std::string TOOL_BASE::m_toolName
protectedinherited

Name of the tool.

Names are expected to obey the format application.ToolName

(eg. pcbnew.InteractiveSelection).

Definition at line 219 of file tool_base.h.

Referenced by TOOL_BASE::GetName().

TOOL_SETTINGS TOOL_BASE::m_toolSettings
protectedinherited

Definition at line 221 of file tool_base.h.

Referenced by TOOL_BASE::attachManager(), and TOOL_BASE::GetSettings().

TOOL_TYPE TOOL_BASE::m_type
protectedinherited

Stores the type of the tool.

Definition at line 212 of file tool_base.h.

Referenced by TOOL_BASE::GetType().

const TOOL_EVENT SELECTION_TOOL::UnselectedEvent
static

Event sent after an item is unselected.

Definition at line 130 of file selection_tool.h.

Referenced by POINT_EDITOR::OnSelectionChange(), SanitizeSelection(), POINT_EDITOR::SetTransitions(), toggleSelection(), UnselectItem(), and UnselectItems().


The documentation for this class was generated from the following files: