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:213
TOOL_ID m_toolId
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:208
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:213
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:214
friend class TOOL_SETTINGS
Definition: tool_base.h:153
SELECTION_LOCK_FLAGS SELECTION_TOOL::CheckLock ( )

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

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

617 {
618  if( !m_locked || m_editModules )
619  return SELECTION_UNLOCKED;
620 
621  bool containsLocked = false;
622 
623  // Check if the selection contains locked items
624  for( const auto& item : m_selection )
625  {
626  switch( item->Type() )
627  {
628  case PCB_MODULE_T:
629  if( static_cast<MODULE*>( item )->IsLocked() )
630  containsLocked = true;
631  break;
632 
633  case PCB_MODULE_EDGE_T:
634  case PCB_MODULE_TEXT_T:
635  if( static_cast<MODULE*>( item->GetParent() )->IsLocked() )
636  containsLocked = true;
637  break;
638 
639  default: // suppress warnings
640  break;
641  }
642  }
643 
644  if( containsLocked )
645  {
646  if( IsOK( m_frame, _( "Selection contains locked items. Do you want to continue?" ) ) )
647  {
648  m_locked = false;
650  }
651  else
652  return SELECTION_LOCKED;
653  }
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:129
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 1231 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().

1232 {
1233  if( m_selection.Empty() )
1234  return;
1235 
1236  for( auto item : m_selection )
1237  unselectVisually( static_cast<BOARD_ITEM*>( item ) );
1238 
1239  m_selection.Clear();
1240  m_selection.SetIsHover( false );
1241 
1242  m_frame->SetCurItem( NULL );
1243  m_locked = true;
1244 
1245  // Inform other potentially interested tools
1247 }
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:106
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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).
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 1250 of file selection_tool.cpp.

References KIGFX::VIEW::Add(), CONTEXT_MENU::Add(), EDA_ITEM::ClearBrightened(), CMENU_NOW, CONTEXT_MENU::DisplayTitle(), Format(), 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().

1251 {
1252  BOARD_ITEM* current = NULL;
1253  PCB_BRIGHT_BOX brightBox;
1254  CONTEXT_MENU menu;
1255 
1256  getView()->Add( &brightBox );
1257 
1258  int limit = std::min( 9, aCollector->GetCount() );
1259 
1260  for( int i = 0; i < limit; ++i )
1261  {
1262  wxString text;
1263  BOARD_ITEM* item = ( *aCollector )[i];
1264  text = item->GetSelectMenuText();
1265 
1266  wxString menuText = wxString::Format("&%d. %s", i + 1, text );
1267  menu.Add( menuText, i + 1 );
1268  }
1269 
1270  menu.SetTitle( _( "Clarify selection" ) );
1271  menu.DisplayTitle( true );
1272  SetContextMenu( &menu, CMENU_NOW );
1273 
1274  while( OPT_TOOL_EVENT evt = Wait() )
1275  {
1276  if( evt->Action() == TA_CONTEXT_MENU_UPDATE )
1277  {
1278  if( current )
1279  current->ClearBrightened();
1280 
1281  int id = *evt->GetCommandId();
1282 
1283  // User has pointed an item, so show it in a different way
1284  if( id > 0 && id <= limit )
1285  {
1286  current = ( *aCollector )[id - 1];
1287  current->SetBrightened();
1288  }
1289  else
1290  {
1291  current = NULL;
1292  }
1293  }
1294  else if( evt->Action() == TA_CONTEXT_MENU_CHOICE )
1295  {
1296  boost::optional<int> id = evt->GetCommandId();
1297 
1298  // User has selected an item, so this one will be returned
1299  if( id && ( *id > 0 ) )
1300  current = ( *aCollector )[*id - 1];
1301  else
1302  current = NULL;
1303 
1304  break;
1305  }
1306 
1307  // Draw a mark to show which item is available to be selected
1308  if( current && current->IsBrightened() )
1309  {
1310  brightBox.SetItem( current );
1311  getView()->SetVisible( &brightBox, true );
1312 // getView()->Hide( &brightBox, false );
1313  getView()->Update( &brightBox, KIGFX::GEOMETRY );
1315  }
1316  }
1317 
1318  getView()->Remove( &brightBox );
1319 
1320 
1321  return current;
1322 }
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:1389
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
Class PCB_BRIGHT_BOX.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
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:1335
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 void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
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:1389
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:99
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 1196 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().

1197 {
1198  auto& opts = m_priv->m_filterOpts;
1199  DIALOG_BLOCK_OPTIONS dlg( m_frame, opts, false, _( "Filter selection" ) );
1200 
1201  const int cmd = dlg.ShowModal();
1202 
1203  if( cmd != wxID_OK )
1204  return 0;
1205 
1206  const auto& board = *getModel<BOARD>();
1207  const auto layerMask = getFilteredLayerSet( opts );
1208 
1209  // copy current selection
1210  auto selection = m_selection.GetItems();
1211 
1212  // clear current selection
1213  clearSelection();
1214 
1215  // copy selection items from the saved selection
1216  // according to the dialog options
1217  for( auto i : selection )
1218  {
1219  auto item = static_cast<BOARD_ITEM*>( i );
1220  bool include = itemIsIncludedByFilter( *item, board, layerMask, opts );
1221 
1222  if( include )
1223  {
1224  select( item );
1225  }
1226  }
1227  return 0;
1228 }
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 1068 of file selection_tool.cpp.

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

Referenced by setTransitions().

1069 {
1070  DIALOG_FIND dlg( m_frame );
1071  dlg.EnableWarp( false );
1072  dlg.SetCallback( std::bind( &SELECTION_TOOL::findCallback, this, _1 ) );
1073  dlg.ShowModal();
1074 
1075  return 0;
1076 }
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 1049 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().

1050 {
1051  clearSelection();
1052 
1053  if( aItem )
1054  {
1055  select( aItem );
1056  EDA_RECT bbox = aItem->GetBoundingBox();
1057  BOX2D viewport( VECTOR2D( bbox.GetOrigin() ), VECTOR2D( bbox.GetSize() ) );
1058  getView()->SetViewport( viewport );
1059 
1060  // Inform other potentially interested tools
1062  }
1063 
1065 }
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:213
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 1079 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().

1080 {
1082 
1083  if( module )
1084  {
1085  clearSelection();
1086  toggleSelection( module );
1087 
1088  // Place event on module origin first, so the generic anchor snap
1089  // doesn't just choose the closest pin for us
1090  // Don't warp the view - we want the component to
1091  // "teleport" to cursor, not move to the components position
1092  getViewControls()->ForceCursorPosition( true, module->GetPosition() );
1093 
1094  // pick the component up and start moving
1095  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
1096  }
1097 
1098  return 0;
1099 }
const wxPoint & GetPosition() const override
Definition: class_module.h:155
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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
PCB_EDIT_FRAME* PCB_TOOL::frame ( ) const
inlineprotectedinherited

Definition at line 125 of file pcb_tool.h.

Referenced by MICROWAVE_TOOL::addMicrowaveFootprint(), PAD_TOOL::applyPadSettings(), EDIT_TOOL::changeTrackWidthOnClick(), PNS::TOOL_BASE::checkSnap(), MODULE_EDITOR_TOOLS::CopyItems(), PAD_TOOL::copyPadSettings(), MICROWAVE_TOOL::createInductorBetween(), ROUTER_TOOL::CustomTrackWidthDialog(), PCB_TOOL::doInteractiveItemPlacement(), ROUTER_TOOL::DpDimensionsDialog(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::DrawVia(), MODULE_EDITOR_TOOLS::EnumeratePads(), EDIT_TOOL::ExchangeFootprints(), ROUTER_TOOL::finishInteractive(), ROUTER_TOOL::InlineDrag(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), LENGTH_TUNER_TOOL::meanderSettingsDialog(), EDIT_TOOL::MeasureTool(), MODULE_EDITOR_TOOLS::ModuleEdgeOutlines(), MODULE_EDITOR_TOOLS::ModuleTextOutlines(), ROUTER_TOOL::onViaCommand(), MODULE_EDITOR_TOOLS::PasteItems(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), PNS::TOOL_BASE::pickSingleItem(), MODULE_EDITOR_TOOLS::PlacePad(), ROUTER_TOOL::prepareInteractive(), PAD_TOOL::pushPadSettings(), PNS::TOOL_BASE::Reset(), ROUTER_TOOL::RouteDiffPair(), LENGTH_TUNER_TOOL::routerOptionsDialog(), ROUTER_TOOL::RouteSingleTrace(), ROUTER_TOOL::SettingsDialog(), ROUTER_TOOL::switchLayerOnViaPlacement(), LENGTH_TUNER_TOOL::TuneDiffPair(), LENGTH_TUNER_TOOL::TuneDiffPairSkew(), LENGTH_TUNER_TOOL::TuneSingleTrace(), and PCB_EDITOR_CONTROL::ZoneFillAll().

125 { return getEditFrame<PCB_EDIT_FRAME>(); }
template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Function getEditFrame()

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

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

187  {
188  return static_cast<T*>( getEditFrameInt() );
189  }
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:208
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:213
template<typename T >
T* TOOL_BASE::getModel ( ) const
inlineprotectedinherited

Function getModel()

Returns the model object if it matches the requested type.

Definition at line 197 of file tool_base.h.

References TOOL_BASE::getModelInt().

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

198  {
199  EDA_ITEM* m = getModelInt();
200 
201  return static_cast<T*>( m );
202  }
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:212
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:214
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::finishTool(), TOOL_MANAGER::InvokeTool(), TOOL_MANAGER::ResetTools(), and TOOL_MANAGER::runTool().

112  {
113  return m_type;
114  }
TOOL_TYPE m_type
Stores the type of the tool.
Definition: tool_base.h:205
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(), guessSelectionCandidates(), PCBNEW_CONTROL::HighContrastMode(), PNS::TOOL_BASE::highlightNet(), PCBNEW_CONTROL::LayerAlphaDec(), PCBNEW_CONTROL::LayerAlphaInc(), 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:213
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:243
KIGFX::VIEW_CONTROLS * TOOL_BASE::getViewControls ( ) const
protectedinherited
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 135 of file tool_interactive.h.

References TOOL_INTERACTIVE::goInternal().

Referenced by ZOOM_TOOL::setTransitions(), LENGTH_TUNER_TOOL::setTransitions(), ROUTER_TOOL::setTransitions(), MICROWAVE_TOOL::setTransitions(), PAD_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(), setTransitions(), EDIT_TOOL::setTransitions(), and DRAWING_TOOL::setTransitions().

137 {
138  TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
139 
140  goInternal( sptr, aConditions );
141 }
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 1655 of file selection_tool.cpp.

References COLLECTOR::Append(), B_SilkS, calcArea(), calcCommonArea(), calcMaxArea(), calcRatio(), COLLECTOR::CountType(), COLLECTOR::Empty(), F_SilkS, PCB_BASE_FRAME::GetActiveLayer(), COLLECTOR::GetCount(), BOARD_ITEM::GetLayer(), BOX2< Vec >::GetPosition(), BOX2< Vec >::GetSize(), TOOL_BASE::getView(), KIGFX::VIEW::GetViewport(), 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().

1656 {
1657  std::set<BOARD_ITEM*> rejected;
1658 
1659  const double footprintAreaRatio = 0.2;
1660  const double modulePadMinCoverRatio = 0.45;
1661  const double padViaAreaRatio = 0.5;
1662  const double trackViaLengthRatio = 2.0;
1663  const double trackTrackLengthRatio = 0.3;
1664  const double textToFeatureMinRatio = 0.2;
1665  const double textToFootprintMinRatio = 0.4;
1666  // If the common area of two compared items is above the following threshold, they cannot
1667  // be rejected (it means they overlap and it might be hard to pick one by selecting
1668  // its unique area).
1669  const double commonAreaRatio = 0.6;
1670 
1671  PCB_LAYER_ID actLayer = m_frame->GetActiveLayer();
1672 
1673  LSET silkLayers( 2, B_SilkS, F_SilkS );
1674 
1675  if( silkLayers[actLayer] )
1676  {
1677  std::set<BOARD_ITEM*> preferred;
1678 
1679  for( int i = 0; i < aCollector.GetCount(); ++i )
1680  {
1681  BOARD_ITEM* item = aCollector[i];
1682  KICAD_T type = item->Type();
1683 
1684  if( ( type == PCB_MODULE_TEXT_T || type == PCB_TEXT_T || type == PCB_LINE_T )
1685  && silkLayers[item->GetLayer()] )
1686  {
1687  preferred.insert( item );
1688  }
1689  }
1690 
1691  if( preferred.size() != 0 )
1692  {
1693  aCollector.Empty();
1694 
1695  for( BOARD_ITEM* item : preferred )
1696  aCollector.Append( item );
1697  return;
1698  }
1699  }
1700 
1701  if( aCollector.CountType( PCB_MODULE_TEXT_T ) > 0 )
1702  {
1703  for( int i = 0; i < aCollector.GetCount(); ++i )
1704  {
1705  if( TEXTE_MODULE* txt = dyn_cast<TEXTE_MODULE*>( aCollector[i] ) )
1706  {
1707  double textArea = calcArea( txt );
1708 
1709  for( int j = 0; j < aCollector.GetCount(); ++j )
1710  {
1711  if( i == j )
1712  continue;
1713 
1714  BOARD_ITEM* item = aCollector[j];
1715  double itemArea = calcArea( item );
1716  double areaRatio = calcRatio( textArea, itemArea );
1717  double commonArea = calcCommonArea( txt, item );
1718  double itemCommonRatio = calcRatio( commonArea, itemArea );
1719  double txtCommonRatio = calcRatio( commonArea, textArea );
1720 
1721  if( item->Type() == PCB_MODULE_T && areaRatio < textToFootprintMinRatio &&
1722  itemCommonRatio < commonAreaRatio )
1723  rejected.insert( item );
1724 
1725  switch( item->Type() )
1726  {
1727  case PCB_TRACE_T:
1728  case PCB_PAD_T:
1729  case PCB_LINE_T:
1730  case PCB_VIA_T:
1731  case PCB_MODULE_T:
1732  if( areaRatio > textToFeatureMinRatio && txtCommonRatio < commonAreaRatio )
1733  rejected.insert( txt );
1734  break;
1735  default:
1736  break;
1737  }
1738  }
1739  }
1740  }
1741  }
1742 
1743  if( aCollector.CountType( PCB_MODULE_T ) > 0 )
1744  {
1745  double maxArea = calcMaxArea( aCollector, PCB_MODULE_T );
1746  BOX2D viewportD = getView()->GetViewport();
1747  BOX2I viewport( VECTOR2I( viewportD.GetPosition() ), VECTOR2I( viewportD.GetSize() ) );
1748 
1749  for( int i = 0; i < aCollector.GetCount(); ++i )
1750  {
1751  if( MODULE* mod = dyn_cast<MODULE*>( aCollector[i] ) )
1752  {
1753  double normalizedArea = calcRatio( calcArea( mod ), maxArea );
1754 
1755  if( normalizedArea > footprintAreaRatio
1756  // filter out components larger than the viewport
1757  || mod->ViewBBox().Contains( viewport ) )
1758  {
1759  rejected.insert( mod );
1760  }
1761  }
1762  }
1763  }
1764 
1765  if( aCollector.CountType( PCB_PAD_T ) > 0 )
1766  {
1767  for( int i = 0; i < aCollector.GetCount(); ++i )
1768  {
1769  if( D_PAD* pad = dyn_cast<D_PAD*>( aCollector[i] ) )
1770  {
1771  double ratio = pad->GetParent()->PadCoverageRatio();
1772 
1773  if( ratio < modulePadMinCoverRatio )
1774  rejected.insert( pad->GetParent() );
1775  }
1776  }
1777  }
1778 
1779  if( aCollector.CountType( PCB_VIA_T ) > 0 )
1780  {
1781  for( int i = 0; i < aCollector.GetCount(); ++i )
1782  {
1783  if( VIA* via = dyn_cast<VIA*>( aCollector[i] ) )
1784  {
1785  double viaArea = calcArea( via );
1786 
1787  for( int j = 0; j < aCollector.GetCount(); ++j )
1788  {
1789  if( i == j )
1790  continue;
1791 
1792  BOARD_ITEM* item = aCollector[j];
1793  double areaRatio = calcRatio( viaArea, calcArea( item ) );
1794 
1795  if( item->Type() == PCB_MODULE_T && areaRatio < modulePadMinCoverRatio )
1796  rejected.insert( item );
1797 
1798  if( item->Type() == PCB_PAD_T && areaRatio < padViaAreaRatio )
1799  rejected.insert( item );
1800 
1801  if( TRACK* track = dyn_cast<TRACK*>( item ) )
1802  {
1803  if( track->GetNetCode() != via->GetNetCode() )
1804  continue;
1805 
1806  double lenRatio = (double) ( track->GetLength() + track->GetWidth() ) /
1807  (double) via->GetWidth();
1808 
1809  if( lenRatio > trackViaLengthRatio )
1810  rejected.insert( track );
1811  }
1812  }
1813  }
1814  }
1815  }
1816 
1817  int nTracks = aCollector.CountType( PCB_TRACE_T );
1818 
1819  if( nTracks > 0 )
1820  {
1821  double maxLength = 0.0;
1822  double minLength = std::numeric_limits<double>::max();
1823  double maxArea = 0.0;
1824  const TRACK* maxTrack = nullptr;
1825 
1826  for( int i = 0; i < aCollector.GetCount(); ++i )
1827  {
1828  if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) )
1829  {
1830  maxLength = std::max( track->GetLength(), maxLength );
1831  maxLength = std::max( (double) track->GetWidth(), maxLength );
1832 
1833  minLength = std::min( std::max( track->GetLength(), (double) track->GetWidth() ), minLength );
1834 
1835  double area = track->GetLength() * track->GetWidth();
1836 
1837  if( area > maxArea )
1838  {
1839  maxArea = area;
1840  maxTrack = track;
1841  }
1842  }
1843  }
1844 
1845  if( maxLength > 0.0 && minLength / maxLength < trackTrackLengthRatio && nTracks > 1 )
1846  {
1847  for( int i = 0; i < aCollector.GetCount(); ++i )
1848  {
1849  if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) )
1850  {
1851  double ratio = std::max( (double) track->GetWidth(), track->GetLength() ) / maxLength;
1852 
1853  if( ratio > trackTrackLengthRatio )
1854  rejected.insert( track );
1855  }
1856  }
1857  }
1858 
1859  for( int j = 0; j < aCollector.GetCount(); ++j )
1860  {
1861  if( MODULE* mod = dyn_cast<MODULE*>( aCollector[j] ) )
1862  {
1863  double ratio = calcRatio( maxArea, mod->GetFootprintRect().GetArea() );
1864 
1865  if( ratio < modulePadMinCoverRatio && calcCommonArea( maxTrack, mod ) < commonAreaRatio )
1866  rejected.insert( mod );
1867  }
1868  }
1869  }
1870 
1871  if( (unsigned) aCollector.GetCount() > rejected.size() ) // do not remove everything
1872  {
1873  for( BOARD_ITEM* item : rejected )
1874  {
1875  aCollector.Remove( item );
1876  }
1877  }
1878 }
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
const Vec & GetSize() const
Definition: box2.h:177
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
int CountType(KICAD_T aType)
Function CountType counts the number of items matching aType.
static double calcArea(const BOARD_ITEM *aItem)
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 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)
BOX2D GetViewport() const
Function GetViewport() Returns the current viewport visible area rectangle.
Definition: view.cpp:501
const Vec & GetPosition() const
Definition: box2.h:182
PCB_BASE_FRAME * m_frame
Pointer to the parent frame.
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
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
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(), SELECTION::SetIsHover(), 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  if( m_selection.Empty() )
269  {
270  selectPoint( evt->Position() );
271  m_selection.SetIsHover( true );
272  }
273 
275  }
276 
277  // double click? Display the properties window
278  else if( evt->IsDblClick( BUT_LEFT ) )
279  {
280  if( m_selection.Empty() )
281  selectPoint( evt->Position() );
282 
284  }
285 
286  // drag with LMB? Select multiple objects (or at least draw a selection box) or drag them
287  else if( evt->IsDrag( BUT_LEFT ) )
288  {
289  if( m_additive || m_subtractive )
290  {
291  selectMultiple();
292  }
293  else if( m_selection.Empty() )
294  {
295  // There is nothing selected, so try to select something
296  if( !selectCursor() )
297  {
298  // If nothings has been selected or user wants to select more
299  // draw the selection box
300  selectMultiple();
301  }
302  else
303  {
304  m_selection.SetIsHover( true );
305  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
306  }
307  }
308 
309  else
310  {
311  // Check if dragging has started within any of selected items bounding box
312  if( selectionContains( evt->Position() ) )
313  {
314  // Yes -> run the move tool and wait till it finishes
315  m_toolMgr->InvokeTool( "pcbnew.InteractiveEdit" );
316  }
317  else
318  {
319  // No -> clear the selection list
320  clearSelection();
321  }
322  }
323  }
324 
325  else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO_PRE )
326  {
327  clearSelection();
328  }
329 
330  else if( evt->Action() == TA_CONTEXT_MENU_CLOSED )
331  {
332  m_menu.CloseContextMenu( evt );
333  }
334  }
335 
336  // This tool is supposed to be active forever
337  assert( false );
338 
339  return 0;
340 }
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:213
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:105
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...
void SetIsHover(bool aIsHover)
Definition: selection.h:61
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:364
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 1325 of file selection_tool.cpp.

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

1326 {
1327  int count = aCollector->GetPrimaryCount(); // try to use preferred layer
1328 
1329  if( 0 == count )
1330  count = aCollector->GetCount();
1331 
1332  for( int i = 0; i < count; ++i )
1333  {
1334  if( ( *aCollector )[i]->Type() != PCB_MODULE_T )
1335  return NULL;
1336  }
1337 
1338  // All are modules, now find smallest MODULE
1339  int minDim = 0x7FFFFFFF;
1340  int minNdx = 0;
1341 
1342  for( int i = 0; i < count; ++i )
1343  {
1344  MODULE* module = (MODULE*) ( *aCollector )[i];
1345 
1346  int lx = module->GetBoundingBox().GetWidth();
1347  int ly = module->GetBoundingBox().GetHeight();
1348 
1349  int lmin = std::min( lx, ly );
1350 
1351  if( lmin < minDim )
1352  {
1353  minDim = lmin;
1354  minNdx = i;
1355  }
1356  }
1357 
1358  return (*aCollector)[minNdx];
1359 }
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 349 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(), EDIT_TOOL::Rotate(), and EDIT_TOOL::uniqueSelected().

350 {
351  if( m_selection.Empty() )
352  {
354  m_selection.SetIsHover( true );
355  }
356 
357  // Be careful with iterators: items can be removed from list
358  // that invalidate iterators.
359  for( unsigned ii = 0; ii < m_selection.GetSize(); ii++ )
360  {
361  EDA_ITEM* item = m_selection[ii];
362 
363  if( ( aFlags & SELECTION_EDITABLE ) && item->Type() == PCB_MARKER_T )
364  {
365  unselect( static_cast<BOARD_ITEM *>( item ) );
366  }
367  }
368 
369  if( aFlags & SELECTION_SANITIZE_PADS )
371 
372  return m_selection;
373 }
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:213
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 85 of file tool_interactive.cpp.

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

Referenced by DRAWING_TOOL::PlaceText().

86 {
87  m_toolMgr->RunMainStack( this, std::move( aFunc ) );
88 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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 1889 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().

1890 {
1891  std::set<BOARD_ITEM*> rejected;
1892  std::set<BOARD_ITEM*> added;
1893 
1894  if( !m_editModules )
1895  {
1896  for( auto i : m_selection )
1897  {
1898  auto item = static_cast<BOARD_ITEM*>( i );
1899  if( item->Type() == PCB_PAD_T )
1900  {
1901  MODULE* mod = static_cast<MODULE*>( item->GetParent() );
1902 
1903  // case 1: module (or its pads) are locked
1904  if( mod && ( mod->PadsLocked() || mod->IsLocked() ) )
1905  {
1906  rejected.insert( item );
1907 
1908  if( !mod->IsLocked() && !mod->IsSelected() )
1909  added.insert( mod );
1910  }
1911 
1912  // case 2: multi-item selection contains both the module and its pads - remove the pads
1913  if( mod && m_selection.Contains( mod ) )
1914  rejected.insert( item );
1915  }
1916  }
1917  }
1918 
1919  if( !rejected.empty() )
1920  {
1921  for( BOARD_ITEM* item : rejected )
1922  unselect( item );
1923 
1924  // Inform other potentially interested tools
1926  }
1927 
1928  if( !added.empty() )
1929  {
1930  for( BOARD_ITEM* item : added )
1931  select( item );
1932 
1933  // Inform other potentially interested tools
1935  }
1936 
1937  return true;
1938 }
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:213
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 1466 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().

1467 {
1468  if( aItem->IsSelected() )
1469  {
1470  return;
1471  }
1472 
1473  if( aItem->Type() == PCB_PAD_T )
1474  {
1475  MODULE* module = static_cast<MODULE*>( aItem->GetParent() );
1476 
1477  if( m_selection.Contains( module ) )
1478  return;
1479  }
1480 
1481  m_selection.Add( aItem );
1482  selectVisually( aItem );
1483 
1484 
1485  if( m_selection.Size() == 1 )
1486  {
1487  // Set as the current item, so the information about selection is displayed
1488  m_frame->SetCurItem( aItem, true );
1489  }
1490  else if( m_selection.Size() == 2 ) // Check only for 2, so it will not be
1491  { // called for every next selected item
1492  // If multiple items are selected, do not show the information about the selected item
1493  m_frame->SetCurItem( NULL, true );
1494  }
1495 }
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 1362 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().

1363 {
1364  // Is high contrast mode enabled?
1365  bool highContrast = getView()->GetPainter()->GetSettings()->GetHighContrast();
1366 
1367  if( highContrast )
1368  {
1369  bool onActive = false; // Is the item on any of active layers?
1370  int layers[KIGFX::VIEW::VIEW_MAX_LAYERS], layers_count;
1371 
1372  // Filter out items that do not belong to active layers
1373  const std::set<unsigned int>& activeLayers = getView()->GetPainter()->
1374  GetSettings()->GetActiveLayers();
1375  aItem->ViewGetLayers( layers, layers_count );
1376 
1377  for( int i = 0; i < layers_count; ++i )
1378  {
1379  if( activeLayers.count( layers[i] ) > 0 ) // Item is on at least one of the active layers
1380  {
1381  onActive = true;
1382  break;
1383  }
1384  }
1385 
1386  if( !onActive ) // We do not want to select items that are in the background
1387  return false;
1388  }
1389 
1390  switch( aItem->Type() )
1391  {
1392  case PCB_VIA_T:
1393  {
1394  // For vias it is enough if only one of layers is visible
1395  PCB_LAYER_ID top, bottom;
1396 
1397  static_cast<const VIA*>( aItem )->LayerPair( &top, &bottom );
1398 
1399  return board()->IsLayerVisible( top ) || board()->IsLayerVisible( bottom );
1400  }
1401  break;
1402 
1403  case PCB_MODULE_T:
1404 
1405  // In the module editor, we do not want to select the module itself
1406  // rather, the module sub-components should be selected individually
1407  if( m_editModules )
1408  {
1409  return false;
1410  }
1411 
1412  if( aItem->IsOnLayer( F_Cu ) && board()->IsElementVisible( LAYER_MOD_FR ) )
1413  return !m_editModules;
1414 
1415  if( aItem->IsOnLayer( B_Cu ) && board()->IsElementVisible( LAYER_MOD_BK ) )
1416  return !m_editModules;
1417 
1418  return false;
1419 
1420  break;
1421 
1422  case PCB_MODULE_TEXT_T:
1423  if( m_multiple && !m_editModules )
1424  return false;
1425 
1426  return view()->IsVisible( aItem ) && board()->IsLayerVisible( aItem->GetLayer() );
1427 
1428  case PCB_MODULE_EDGE_T:
1429  case PCB_PAD_T:
1430  {
1431  // Multiple selection is only allowed in modedit mode
1432  // In pcbnew, you have to select subparts of modules
1433  // one-by-one, rather than with a drag selection.
1434  // This is so you can pick up items under an (unlocked)
1435  // module without also moving the module's sub-parts.
1436  if( m_multiple && !m_editModules )
1437  return false;
1438 
1439  // When editing modules, it's allowed to select them, even when
1440  // locked, since you already have to explicitly activate the
1441  // module editor to get to this stage
1442  if ( !m_editModules )
1443  {
1444  MODULE* mod = static_cast<const D_PAD*>( aItem )->GetParent();
1445  if( mod && mod->IsLocked() )
1446  return false;
1447  }
1448 
1449  break;
1450  }
1451 
1452  // These are not selectable
1453  case NOT_USED:
1454  case TYPE_NOT_INIT:
1455  return false;
1456 
1457  default: // Suppress warnings
1458  break;
1459  }
1460 
1461  // All other items are selected only if the layer on which they exist is visible
1462  return board()->IsLayerVisible( aItem->GetLayer() );
1463 }
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:1375
#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_PAD_T, 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  std::list<int> removeCodeList;
919  constexpr KICAD_T padType[] = { PCB_PAD_T, EOT };
920 
921  for( int netCode : netcodeList )
922  {
923  for( BOARD_CONNECTED_ITEM* mitem : board()->GetConnectivity()->GetNetItems( netCode, padType ) )
924  {
925  if( mitem->Type() == PCB_PAD_T)
926  {
927  bool found = ( std::find( modList.begin(), modList.end(),
928  mitem->GetParent() ) != modList.end() );
929 
930  if( !found )
931  {
932  // if we cannot find the module of the pad in the modList
933  // then we can assume that that module is not located in the same
934  // schematic, therefore invalidate this netcode.
935  removeCodeList.push_back( netCode );
936  break;
937  }
938  }
939  }
940  }
941 
942  // remove all duplicates
943  removeCodeList.sort();
944  removeCodeList.unique();
945 
946  for( int removeCode : removeCodeList )
947  {
948  netcodeList.remove( removeCode );
949  }
950 
951  std::list<BOARD_CONNECTED_ITEM*> localConnectionList;
952  constexpr KICAD_T trackViaType[] = { PCB_TRACE_T, PCB_VIA_T, EOT };
953 
954  for( int netCode : netcodeList )
955  {
956  for( BOARD_CONNECTED_ITEM* item : board()->GetConnectivity()->GetNetItems( netCode, trackViaType ) )
957  {
958  localConnectionList.push_back( item );
959  }
960  }
961 
962  for( BOARD_ITEM* i : modList )
963  {
964  if( i != NULL )
965  select( i );
966  }
967 
968  for( BOARD_CONNECTED_ITEM* i : localConnectionList )
969  {
970  if( i != NULL )
971  select( i );
972  }
973 }
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 D_PAD, a pad in a footprint
Definition: typeinfo.h:102
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:213
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:213
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 472 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().

473 {
474  if( aSelectAlways || m_selection.Empty() )
475  {
476  clearSelection();
477  selectPoint( getViewControls()->GetCursorPosition( false ) );
478  }
479 
480  return !m_selection.Empty();
481 }
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 1560 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().

1561 {
1562  const unsigned GRIP_MARGIN = 20;
1563  VECTOR2D margin = getView()->ToWorld( VECTOR2D( GRIP_MARGIN, GRIP_MARGIN ), false );
1564 
1565  // Check if the point is located within any of the currently selected items bounding boxes
1566  for( auto item : m_selection )
1567  {
1568  BOX2I itemBox = item->ViewBBox();
1569  itemBox.Inflate( margin.x, margin.y ); // Give some margin for gripping an item
1570 
1571  if( itemBox.Contains( aPoint ) )
1572  return true;
1573  }
1574 
1575  return false;
1576 }
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:213
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:213
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 484 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().

485 {
486  bool cancelled = false; // Was the tool cancelled while it was running?
487  m_multiple = true; // Multiple selection mode is active
488  KIGFX::VIEW* view = getView();
489  getViewControls()->SetAutoPan( true );
490 
492  view->Add( &area );
493 
494  while( OPT_TOOL_EVENT evt = Wait() )
495  {
496  if( evt->IsCancel() )
497  {
498  cancelled = true;
499  break;
500  }
501 
502  if( evt->IsDrag( BUT_LEFT ) )
503  {
504 
505  // Start drawing a selection box
506  area.SetOrigin( evt->DragOrigin() );
507  area.SetEnd( evt->Position() );
508  area.SetAdditive( m_additive );
510 
511  view->SetVisible( &area, true );
512  view->Update( &area );
513  }
514 
515  if( evt->IsMouseUp( BUT_LEFT ) )
516  {
517  // End drawing the selection box
518  view->SetVisible( &area, false );
519 
520  // Mark items within the selection box as selected
521  std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
522 
523  // Filter the view items based on the selection box
524  BOX2I selectionBox = area.ViewBBox();
525  view->Query( selectionBox, selectedItems ); // Get the list of selected items
526 
527  std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR>::iterator it, it_end;
528 
529  int width = area.GetEnd().x - area.GetOrigin().x;
530  int height = area.GetEnd().y - area.GetOrigin().y;
531 
532  // Construct an EDA_RECT to determine BOARD_ITEM selection
533  EDA_RECT selectionRect( wxPoint( area.GetOrigin().x, area.GetOrigin().y ),
534  wxSize( width, height ) );
535 
536  selectionRect.Normalize();
537 
538  for( it = selectedItems.begin(), it_end = selectedItems.end(); it != it_end; ++it )
539  {
540  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first );
541 
542  if( !item || !selectable( item ) )
543  continue;
544 
545  /* Selection mode depends on direction of drag-selection:
546  * Left > Right : Select objects that are fully enclosed by selection
547  * Right > Left : Select objects that are crossed by selection
548  */
549 
550  if( width >= 0 )
551  {
552  if( selectionBox.Contains( item->ViewBBox() ) )
553  {
554  if( m_subtractive )
555  unselect( item );
556  else
557  select( item );
558  }
559  }
560  else
561  {
562  if( item->HitTest( selectionRect, false ) )
563  {
564  if( m_subtractive )
565  unselect( item );
566  else
567  select( item );
568  }
569 
570  }
571  }
572 
573  if( m_selection.Size() == 1 )
574  m_frame->SetCurItem( static_cast<BOARD_ITEM*>( m_selection.Front() ) );
575  else
576  m_frame->SetCurItem( NULL );
577 
578  // Inform other potentially interested tools
579  if( !m_selection.Empty() )
581 
582  break; // Stop waiting for events
583  }
584  }
585 
586  // Stop drawing the selection box
587  view->Remove( &area );
588  m_multiple = false; // Multiple selection mode is inactive
589  getViewControls()->SetAutoPan( false );
590 
591  return cancelled;
592 }
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:213
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:1389
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:1335
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:213
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 999 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().

1000 {
1001  clearSelection();
1002  wxString* sheetpath = aEvent.Parameter<wxString*>();
1003 
1004  selectAllItemsOnSheet( *sheetpath );
1005 
1006  zoomFitSelection();
1007 
1008  if( m_selection.Size() > 0 )
1010 
1011  return 0;
1012 }
void zoomFitSelection(void)
Zooms the screen to center and fit the current selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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 404 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().

405 {
406  BOARD_ITEM* item;
408  GENERAL_COLLECTOR collector;
409 
410  collector.Collect( board(),
412  wxPoint( aWhere.x, aWhere.y ), guide );
413 
414  bool anyCollected = collector.GetCount() != 0;
415 
416  // Remove unselectable items
417  for( int i = collector.GetCount() - 1; i >= 0; --i )
418  {
419  if( !selectable( collector[i] ) || ( aOnDrag && collector[i]->IsLocked() ) )
420  collector.Remove( i );
421  }
422 
423  switch( collector.GetCount() )
424  {
425  case 0:
426  if( !m_additive && anyCollected )
427  {
428  clearSelection();
429  }
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 )
452  {
454  }
455 
456  item = disambiguationMenu( &collector );
457 
458  if( item )
459  {
460  toggleSelection( item );
461 
462  return true;
463  }
464  }
465  break;
466  }
467 
468  return false;
469 }
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 1015 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().

1016 {
1017  if( !selectCursor( true ) )
1018  return 0;
1019 
1020  // this function currently only supports modules since they are only
1021  // on one sheet.
1022  auto item = m_selection.Front();
1023 
1024  if( !item )
1025  return 0;
1026 
1027  if( item->Type() != PCB_MODULE_T )
1028  return 0;
1029 
1030  auto mod = dynamic_cast<MODULE*>( item );
1031 
1032  clearSelection();
1033 
1034  // get the lowest subsheet name for this.
1035  wxString sheetPath = mod->GetPath();
1036  sheetPath = sheetPath.BeforeLast( '/' );
1037  sheetPath = sheetPath.AfterLast( '/' );
1038 
1039  selectAllItemsOnSheet( sheetPath );
1040 
1041  // Inform other potentially interested tools
1042  if( m_selection.Size() > 0 )
1044 
1045  return 0;
1046 }
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:213
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 1514 of file selection_tool.cpp.

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

Referenced by select().

1515 {
1516  // Hide the original item, so it is shown only on overlay
1517  aItem->SetSelected();
1518  view()->Hide( aItem, true );
1519 
1520  // Modules are treated in a special way - when they are selected, we have to
1521  // unselect all the parts that make the module, not the module itself
1522 
1523  if( aItem->Type() == PCB_MODULE_T )
1524  {
1525  static_cast<MODULE*>( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item )
1526  {
1527  item->SetSelected();
1528  view()->Hide( item, true );
1529  });
1530  }
1531 
1532  view()->Update( &m_selection );
1533 }
void Hide(VIEW_ITEM *aItem, bool aHide=true)
Temporarily hides the item in the view (e.g.
Definition: view.cpp:1356
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:1389
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 74 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().

75 {
76  if( aMenu )
77  aMenu->SetTool( this );
78  else
79  aTrigger = CMENU_OFF;
80 
81  m_toolMgr->ScheduleContextMenu( this, aMenu, aTrigger );
82 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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.

Implements TOOL_INTERACTIVE.

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

596 {
604  Go( &SELECTION_TOOL::find, PCB_ACTIONS::find.MakeEvent() );
613 }
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:108
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:374
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:377
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 376 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().

377 {
378  if( aItem->IsSelected() )
379  {
380  unselect( aItem );
381 
382  // Inform other potentially interested tools
384  }
385  else
386  {
387  if( !m_additive )
388  clearSelection();
389 
390  // Prevent selection of invisible or inactive items
391  if( selectable( aItem ) )
392  {
393  select( aItem );
394 
395  // Inform other potentially interested tools
397  }
398  }
399 
401 }
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:213
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 1498 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().

1499 {
1500  if( !aItem->IsSelected() )
1501  return;
1502 
1503  m_selection.Remove( aItem );
1504  unselectVisually( aItem );
1505 
1506  if( m_selection.Empty() )
1507  {
1508  m_frame->SetCurItem( NULL );
1509  m_locked = true;
1510  }
1511 }
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:213
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:213
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 1536 of file selection_tool.cpp.

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

1537 {
1538  // Restore original item visibility
1539  aItem->ClearSelected();
1540  view()->Hide( aItem, false );
1541  view()->Update( aItem );
1542 
1543  // Modules are treated in a special way - when they are selected, we have to
1544  // unselect all the parts that make the module, not the module itself
1545 
1546  if( aItem->Type() == PCB_MODULE_T )
1547  {
1548  static_cast<MODULE*>( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item )
1549  {
1550  item->ClearSelected();
1551  view()->Hide( item, false );
1552  view()->Update( item );
1553  });
1554  }
1555 
1556  view()->Update( &m_selection );
1557 }
void Hide(VIEW_ITEM *aItem, bool aHide=true)
Temporarily hides the item in the view (e.g.
Definition: view.cpp:1356
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
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:1389
int SELECTION_TOOL::updateSelection ( const TOOL_EVENT aEvent)
private

Event handler to update the selection VIEW_ITEM.

Definition at line 1881 of file selection_tool.cpp.

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

Referenced by setTransitions().

1882 {
1883  getView()->Update( &m_selection );
1884 
1885  return 0;
1886 }
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:1389
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:213
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 976 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().

977 {
978  //Should recalculate the view to zoom in on the selection
979  auto selectionBox = m_selection.ViewBBox();
980  auto canvas = m_frame->GetGalCanvas();
981  auto view = getView();
982 
983  VECTOR2D screenSize = view->ToWorld( canvas->GetClientSize(), false );
984 
985  if( !( selectionBox.GetWidth() == 0 ) || !( selectionBox.GetHeight() == 0 ) )
986  {
987  VECTOR2D vsize = selectionBox.GetSize();
988  double scale = view->GetScale() / std::max( fabs( vsize.x / screenSize.x ),
989  fabs( vsize.y / screenSize.y ) );
990  view->SetScale( scale );
991  view->SetCenter( selectionBox.Centre() );
992  view->Add( &m_selection );
993  }
994 
996 }
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(), POINT_EDITOR::OnSelectionChange(), and PCB_EDITOR_CONTROL::setTransitions().

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 208 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 213 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PCBNEW_CONTROL::AppendBoard(), PAD_TOOL::applyPadSettings(), TOOL_BASE::attachManager(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), 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(), ALIGN_DISTRIBUTE_TOOL::Init(), PAD_TOOL::Init(), POINT_EDITOR::Init(), PCB_EDITOR_CONTROL::Init(), POSITION_RELATIVE_TOOL::Init(), EDIT_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(), TOOL_INTERACTIVE::resetTransitions(), 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::UpdateSelectionRatsnest(), 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 212 of file tool_base.h.

Referenced by TOOL_BASE::GetName().

TOOL_SETTINGS TOOL_BASE::m_toolSettings
protectedinherited

Definition at line 214 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 205 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: