KiCad PCB EDA Suite
EDIT_TOOL Class Reference

Class EDIT_TOOL. More...

#include <edit_tool.h>

Inheritance diagram for EDIT_TOOL:
PCB_TOOL TOOL_INTERACTIVE TOOL_BASE

Public Types

enum  RESET_REASON { RUN, MODEL_RELOAD, GAL_SWITCH }
 

Determines the reason of reset for a tool

More...
 

Public Member Functions

 EDIT_TOOL ()
 
void Reset (RESET_REASON aReason) override
 Function Reset() Brings the tool to a known, initial state. More...
 
bool Init () override
 Function Init() Init() is called once upon a registration of the tool. More...
 
int Main (const TOOL_EVENT &aEvent)
 Function Main() More...
 
int Properties (const TOOL_EVENT &aEvent)
 Function Edit() More...
 
int Rotate (const TOOL_EVENT &aEvent)
 Function Rotate() More...
 
int Flip (const TOOL_EVENT &aEvent)
 Function Flip() More...
 
int Mirror (const TOOL_EVENT &aEvent)
 Function Mirror. More...
 
int Remove (const TOOL_EVENT &aEvent)
 Function Remove() More...
 
int Duplicate (const TOOL_EVENT &aEvent)
 Function Duplicate() More...
 
int MoveExact (const TOOL_EVENT &aEvent)
 Function MoveExact() More...
 
int CreateArray (const TOOL_EVENT &aEvent)
 Function CreateArray() More...
 
int ExchangeFootprints (const TOOL_EVENT &aEvent)
 Function ExchangeFootprints() More...
 
int MeasureTool (const TOOL_EVENT &aEvent)
 

Launches a tool to measure between points

More...
 
void SetTransitions () override
 

Sets up handlers for various events.

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

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

void updateRatsnest (bool aRedraw)
 

Updates ratsnest for selected items.

More...
 
wxPoint getModificationPoint (const SELECTION &aSelection)
 

Returns the right modification point (e.g.

More...
 
int editFootprintInFpEditor (const TOOL_EVENT &aEvent)
 
bool invokeInlineRouter ()
 
bool hoverSelection (bool aSanitize=true)
 Function hoverSelection() More...
 
template<class T >
T * uniqueSelected ()
 Function uniqueSelected() More...
 
template<class T >
T * uniqueHoverSelection (bool aSanitize=true)
 Function uniqueHoverSelection() More...
 

Private Attributes

SELECTION_TOOLm_selectionTool
 

Selection tool used for obtaining selected items

More...
 
bool m_dragging
 

Flag determining if anything is being dragged right now

More...
 
wxPoint m_offset
 

Offset from the dragged item's center (anchor)

More...
 
VECTOR2I m_cursor
 

Last cursor position (needed for getModificationPoint() to avoid changes of edit reference point).

More...
 
std::unique_ptr< BOARD_COMMITm_commit
 

Detailed Description

Class EDIT_TOOL.

The interactive edit tool. Allows to move, rotate, flip and change properties of items selected using the pcbnew.InteractiveSelection tool.

Definition at line 44 of file edit_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

EDIT_TOOL::EDIT_TOOL ( )

Definition at line 161 of file edit_tool.cpp.

161  :
162  PCB_TOOL( "pcbnew.InteractiveEdit" ), m_selectionTool( NULL ),
163  m_dragging( false )
164 {
165 }
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
PCB_TOOL(TOOL_ID aId, const std::string &aName)
Constructor.
Definition: pcb_tool.h:65

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(), Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), DRAWING_TOOL::PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), DRAWING_TOOL::SetAnchor(), ROUTER_TOOL::SettingsDialog(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

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

Function attachManager()

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

Definition at line 54 of file tool_base.cpp.

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

Referenced by TOOL_MANAGER::RegisterTool().

55 {
56  m_toolMgr = aManager;
57  m_toolSettings = TOOL_SETTINGS( this );
58 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:221
friend class TOOL_SETTINGS
Definition: tool_base.h:160
KIGFX::VIEW_CONTROLS* PCB_TOOL::controls ( ) const
inlineprotectedinherited
int EDIT_TOOL::CreateArray ( const TOOL_EVENT aEvent)

Function CreateArray()

Creates an array of the selected items, invoking the array editor dialog to set the array options

Definition at line 993 of file edit_tool.cpp.

References PCB_TOOL::m_editModules, m_selectionTool, and SELECTION_TOOL::RequestSelection().

Referenced by SetTransitions().

994 {
995  const auto& selection = m_selectionTool->RequestSelection();
996 
997  if( selection.Empty() )
998  return 0;
999 
1000  // we have a selection to work on now, so start the tool process
1001  PCB_BASE_FRAME* editFrame = getEditFrame<PCB_BASE_FRAME>();
1002  GAL_ARRAY_CREATOR array_creator( *editFrame, m_editModules, selection );
1003  array_creator.Invoke();
1004 
1005  return 0;
1006 }
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
bool m_editModules
Definition: pcb_tool.h:128
class PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer...
void PCB_TOOL::doInteractiveItemPlacement ( INTERACTIVE_PLACER_BASE aPlacer,
const wxString &  aCommitMessage,
int  aOptions = IPO_ROTATE | IPO_FLIP | IPO_REPEAT 
)
protectedinherited

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

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

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

Definition at line 38 of file pcb_tool.cpp.

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

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

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

Function Duplicate()

Duplicates the current selection and starts a move action.

Definition at line 846 of file edit_tool.cpp.

References EDA_ITEM::ClearSelected(), EDA_DRAW_FRAME::DisplayToolMsg(), BOARD::Duplicate(), MODULE::Duplicate(), PCB_ACTIONS::duplicateIncrement, PCB_ACTIONS::editActivate, Format(), PCB_BASE_FRAME::GetBoard(), TOOL_EVENT::IsAction(), m_commit, PCB_TOOL::m_editModules, BOARD::m_Modules, m_selectionTool, TOOL_BASE::m_toolMgr, Main(), TOOL_ACTION::MakeEvent(), PCB_ZONE_AREA_T, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_DELETABLE, SELECTION_SANITIZE_PADS, PCB_ACTIONS::selectionClear, and PCB_ACTIONS::selectItems.

Referenced by SetTransitions().

847 {
848  bool increment = aEvent.IsAction( &PCB_ACTIONS::duplicateIncrement );
849 
850  // Be sure that there is at least one item that we can modify
852 
853  if( selection.Empty() )
854  return 0;
855 
856  // we have a selection to work on now, so start the tool process
857  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
858 
859  std::vector<BOARD_ITEM*> new_items;
860  new_items.reserve( selection.Size() );
861 
862  BOARD_ITEM* orig_item = nullptr;
863  BOARD_ITEM* dupe_item = nullptr;
864 
865  // Each selected item is duplicated and pushed to new_items list
866  // Old selection is cleared, and new items are then selected.
867  for( auto item : selection )
868  {
869  if( !item )
870  continue;
871 
872  orig_item = static_cast<BOARD_ITEM*>( item );
873 
874  if( m_editModules )
875  {
876  dupe_item = editFrame->GetBoard()->m_Modules->Duplicate( orig_item, increment );
877  }
878  else
879  {
880 #if 0
881  // @TODO: see if we allow zone duplication here
882  // Duplicate zones is especially tricky (overlaping zones must be merged)
883  // so zones are not duplicated
884  if( item->Type() != PCB_ZONE_AREA_T )
885 #endif
886  dupe_item = editFrame->GetBoard()->Duplicate( orig_item );
887  }
888 
889  if( dupe_item )
890  {
891  // Clear the selection flag here, otherwise the SELECTION_TOOL
892  // will not properly select it later on
893  dupe_item->ClearSelected();
894 
895  new_items.push_back( dupe_item );
896  m_commit->Add( dupe_item );
897  }
898  }
899 
900  // Clear the old selection first
902 
903  // Select the new items
904  m_toolMgr->RunAction( PCB_ACTIONS::selectItems, true, &new_items );
905 
906  // record the new items as added
907  if( !selection.Empty() )
908  {
909  editFrame->DisplayToolMsg( wxString::Format( _( "Duplicated %d item(s)" ),
910  (int) new_items.size() ) );
911 
912  // If items were duplicated, pick them up
913  // this works well for "dropping" copies around and pushes the commit
915  Main( evt );
916  }
917 
918  return 0;
919 }
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
int Main(const TOOL_EVENT &aEvent)
Function Main()
Definition: edit_tool.cpp:248
static TOOL_ACTION editActivate
Activation of the edit tool.
Definition: pcb_actions.h:87
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
void ClearSelected()
Definition: base_struct.h:231
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
BOARD_ITEM * Duplicate(const BOARD_ITEM *aItem, bool aIncrementPadNumbers, bool aAddToModule=false)
Function Duplicate Duplicate a given item within the module, without adding to the board...
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:114
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
BOARD * GetBoard() const
bool IsAction(const TOOL_ACTION *aAction) const
Function IsAction() Tests if the event contains an action issued upon activation of the given TOOL_AC...
Definition: tool_event.cpp:54
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
Definition: pcb_actions.h:114
Class TOOL_EVENT.
Definition: tool_event.h:162
bool m_editModules
Definition: pcb_tool.h:128
TOOL_EVENT MakeEvent() const
Function HasHotKey() Checks if the action has a hot key assigned.
Definition: tool_action.h:104
void DisplayToolMsg(const wxString &msg)
Definition: draw_frame.cpp:497
Common, abstract interface for edit frames.
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
DLIST< MODULE > m_Modules
Definition: class_board.h:245
BOARD_ITEM * Duplicate(const BOARD_ITEM *aItem, bool aAddToBoard=false)
int EDIT_TOOL::editFootprintInFpEditor ( const TOOL_EVENT aEvent)
private

Definition at line 1185 of file edit_tool.cpp.

References FRAME_PCB_MODULE_EDITOR, PCB_BASE_FRAME::GetCurItem(), GetNewTimeStamp(), EDA_ITEM::GetTimeStamp(), KIWAY_HOLDER::Kiway(), FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD(), m_selectionTool, TOOL_BASE::m_toolMgr, mod, PCB_BASE_FRAME::OnModify(), KIWAY::Player(), SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, PCB_BASE_FRAME::SetCurItem(), and EDA_ITEM::SetTimeStamp().

Referenced by SetTransitions().

1186 {
1187  const auto& selection = m_selectionTool->RequestSelection();
1188 
1189  if( selection.Empty() )
1190  return 0;
1191 
1192  MODULE* mod = selection.FirstOfKind<MODULE>();
1193 
1194  if( !mod )
1195  return 0;
1196 
1197  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
1198 
1199  editFrame->SetCurItem( mod );
1200 
1201  if( editFrame->GetCurItem()->GetTimeStamp() == 0 ) // Module Editor needs a non null timestamp
1202  {
1203  editFrame->GetCurItem()->SetTimeStamp( GetNewTimeStamp() );
1204  editFrame->OnModify();
1205  }
1206 
1208 
1209  editor->Load_Module_From_BOARD( (MODULE*) editFrame->GetCurItem() );
1210  editFrame->SetCurItem( NULL ); // the current module could be deleted by
1211 
1212  editor->Show( true );
1213  editor->Raise(); // Iconize( false );
1214 
1215  if( selection.IsHover() )
1217 
1218  return 0;
1219 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_player.h:60
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
time_t GetNewTimeStamp()
Definition: common.cpp:166
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
void SetTimeStamp(time_t aNewTimeStamp)
Definition: base_struct.h:203
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, KIWAY_PLAYER *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:302
bool Load_Module_From_BOARD(MODULE *Module)
Function Load_Module_From_BOARD load in Modedit a footprint from the main board.
Definition: loadcmp.cpp:75
time_t GetTimeStamp() const
Definition: base_struct.h:204
virtual void OnModify()
Function OnModify Virtual Must be called after a change in order to set the "modify" flag of the curr...
Common, abstract interface for edit frames.
BOARD_ITEM * GetCurItem()
#define mod(a, n)
Definition: greymap.cpp:24
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 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 EDIT_TOOL::ExchangeFootprints ( const TOOL_EVENT aEvent)

Function ExchangeFootprints()

Invoke the dialog used to change the footprints used for modules and update module footprints based on result

Definition at line 1009 of file edit_tool.cpp.

References PCB_TOOL::frame(), m_selectionTool, TOOL_BASE::m_toolMgr, mod, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, PCB_BASE_FRAME::SetCurItem(), and DIALOG_SHIM::ShowQuasiModal().

Referenced by SetTransitions().

1010 {
1011  const auto& selection = m_selectionTool->RequestSelection();
1012 
1013  if( selection.Empty() )
1014  return 0;
1015 
1016  MODULE* mod = selection.FirstOfKind<MODULE> ();
1017 
1018  if( !mod )
1019  return 0;
1020 
1021  frame()->SetCurItem( mod );
1022 
1023  // Footprint exchange could remove modules, so they have to be
1024  // removed from the selection first
1026 
1027  // invoke the exchange dialog process
1028  {
1029  DIALOG_EXCHANGE_MODULE dialog( frame(), mod );
1030  dialog.ShowQuasiModal();
1031  }
1032 
1033  // The current item can be deleted by exchange module, and the
1034  // selection is emptied, so remove current item from frame info area
1035  frame()->SetCurItem( nullptr );
1036 
1037  return 0;
1038 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:125
#define mod(a, n)
Definition: greymap.cpp:24
int EDIT_TOOL::Flip ( const TOOL_EVENT aEvent)

Function Flip()

Rotates currently selected items. The rotation point is the current cursor position.

Definition at line 645 of file edit_tool.cpp.

References SELECTION_TOOL::CheckLock(), getModificationPoint(), m_commit, m_dragging, m_offset, m_selectionTool, TOOL_BASE::m_toolMgr, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_LOCKED, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, and updateRatsnest().

Referenced by SetTransitions().

646 {
647  const auto& selection = m_selectionTool->RequestSelection();
648 
650  return 0;
651 
652  if( selection.Empty() )
653  return 0;
654 
655  wxPoint modPoint = getModificationPoint( selection );
656 
657  for( auto item : selection )
658  {
659  m_commit->Modify( item );
660  static_cast<BOARD_ITEM*>( item )->Flip( modPoint );
661  }
662 
663  // Update the dragging point offset
664  m_offset = static_cast<BOARD_ITEM*>( selection.Front() )->GetPosition() - modPoint;
665 
666  if( !m_dragging )
667  m_commit->Push( _( "Flip" ) );
668  else
669  updateRatsnest( true );
670 
671  if( selection.IsHover() )
673 
675 
676  return 0;
677 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
wxPoint getModificationPoint(const SELECTION &aSelection)
Returns the right modification point (e.g.
Definition: edit_tool.cpp:1167
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
wxPoint m_offset
Offset from the dragged item's center (anchor)
Definition: edit_tool.h:142
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
int Flip(const TOOL_EVENT &aEvent)
Function Flip()
Definition: edit_tool.cpp:645
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
void updateRatsnest(bool aRedraw)
Updates ratsnest for selected items.
Definition: edit_tool.cpp:1154
template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Function getEditFrame()

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

Definition at line 193 of file tool_base.h.

References TOOL_BASE::getEditFrameInt().

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

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

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

The identifier is set by an instance of TOOL_MANAGER.

Returns
Identifier of the tool.

Definition at line 122 of file tool_base.h.

References TOOL_BASE::m_toolId.

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

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

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

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

Definition at line 144 of file tool_base.h.

References TOOL_BASE::m_toolMgr.

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

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

Function getModel()

Returns the model object if it matches the requested type.

Definition at line 204 of file tool_base.h.

References TOOL_BASE::getModelInt().

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

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

Returns the right modification point (e.g.

for rotation), depending on the number of

selected items.

Definition at line 1167 of file edit_tool.cpp.

References SELECTION::Front(), TOOL_MANAGER::GetCurrentToolId(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_BASE::getViewControls(), m_cursor, m_offset, TOOL_BASE::m_toolId, TOOL_BASE::m_toolMgr, SELECTION::Size(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Flip(), Main(), Mirror(), and Rotate().

1168 {
1169  if( aSelection.Size() == 1 )
1170  {
1171  return static_cast<BOARD_ITEM*>( aSelection.Front() )->GetPosition() - m_offset;
1172  }
1173  else
1174  {
1175  // If EDIT_TOOL is not currently active then it means that the cursor position is not
1176  // updated, so we have to fetch the latest value
1177  if( m_toolMgr->GetCurrentToolId() != m_toolId )
1179 
1180  return wxPoint( m_cursor.x, m_cursor.y );
1181  }
1182 }
VECTOR2I m_cursor
Last cursor position (needed for getModificationPoint() to avoid changes of edit reference point)...
Definition: edit_tool.h:146
int GetCurrentToolId() const
Returns id of the tool that is on the top of the active tools stack (was invoked the most recently)...
Definition: tool_manager.h:268
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
EDA_ITEM * Front() const
Definition: selection.h:144
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
TOOL_ID m_toolId
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:215
wxPoint m_offset
Offset from the dragged item's center (anchor)
Definition: edit_tool.h:142
virtual VECTOR2D GetCursorPosition() const =0
Function GetCursorPosition() Returns the current cursor position in world coordinates.
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
int Size() const
Returns the number of selected parts.
Definition: selection.h:112
const std::string& TOOL_BASE::GetName ( void  ) const
inlineinherited

Function GetName() Returns the name of the tool.

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

Returns
The name of the tool.

Definition at line 133 of file tool_base.h.

References TOOL_BASE::m_toolName.

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

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

Definition at line 72 of file tool_base.cpp.

References TOOL_BASE::m_toolSettings.

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

73 {
74  return m_toolSettings;
75 }
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:221
TOOL_TYPE TOOL_BASE::GetType ( ) const
inlineinherited

Function GetType() Returns the type of the tool.

Returns
The type of the tool.

Definition at line 111 of file tool_base.h.

References TOOL_BASE::m_type.

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

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

Function getView()

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

Returns
The instance of VIEW.

Definition at line 30 of file tool_base.cpp.

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

Referenced by PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), PCBNEW_CONTROL::CursorControl(), SELECTION_TOOL::disambiguationMenu(), MICROWAVE_TOOL::drawMicrowaveInductor(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), SELECTION_TOOL::findCallback(), ROUTER_TOOL::getStartLayer(), PCBNEW_CONTROL::GridSetOrigin(), PCBNEW_CONTROL::HighContrastMode(), PNS::TOOL_BASE::highlightNet(), PCBNEW_CONTROL::LayerAlphaDec(), PCBNEW_CONTROL::LayerAlphaInc(), Main(), MeasureTool(), MODULE_EDITOR_TOOLS::ModuleEdgeOutlines(), MODULE_EDITOR_TOOLS::ModuleTextOutlines(), 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(), SELECTION_TOOL::Reset(), SELECTION_TOOL::selectable(), SELECTION_TOOL::selectionContains(), SELECTION_TOOL::selectMultiple(), ZOOM_TOOL::selectRegion(), PCBNEW_CONTROL::TrackDisplayMode(), POINT_EDITOR::updateEditedPoint(), COMMON_TOOLS::updateGrid(), PCBNEW_CONTROL::updateGrid(), POINT_EDITOR::updatePoints(), SELECTION_TOOL::updateSelection(), PNS::TOOL_BASE::updateStartItem(), PCBNEW_CONTROL::ViaDisplayMode(), PCB_TOOL::view(), PCBNEW_CONTROL::ZoneDisplayMode(), COMMON_TOOLS::ZoomFitScreen(), SELECTION_TOOL::zoomFitSelection(), COMMON_TOOLS::ZoomInOutCenter(), and SELECTION_TOOL::~SELECTION_TOOL().

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

Function getViewControls()

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

Returns
The instance of VIEW_CONTROLS.

Definition at line 36 of file tool_base.cpp.

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

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

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

Function Go()

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

Definition at line 122 of file tool_interactive.h.

References TOOL_INTERACTIVE::goInternal().

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

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

Function hoverSelection()

If there are no items currently selected, it tries to choose the item that is under he cursor or displays a disambiguation menu if there are multiple items.

Parameters
aSanitizesanitize selection using SanitizeSelection()
Returns
true if the eventual selection contains any items, or false if it fails to select any items.

Referenced by uniqueHoverSelection().

bool EDIT_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 177 of file edit_tool.cpp.

References CONDITIONAL_MENU::AddItem(), SELECTION_CONDITIONS::Count(), PCB_ACTIONS::createArray, DisplayError(), PCB_ACTIONS::duplicate, PCB_ACTIONS::editActivate, PCB_ACTIONS::editFootprintInFpEditor, PCB_ACTIONS::exchangeFootprints, TOOL_MANAGER::FindTool(), PCB_ACTIONS::flip, TOOL_MENU::GetMenu(), SELECTION_TOOL::GetToolMenu(), PCB_TOOL::m_editModules, m_offset, m_selectionTool, TOOL_BASE::m_toolMgr, PCB_ACTIONS::mirror, PCB_ACTIONS::moveExact, SELECTION_CONDITIONS::NotEmpty(), SELECTION_CONDITIONS::OnlyType(), SELECTION_CONDITIONS::OnlyTypes(), PCB_MODULE_T, PCB_ACTIONS::positionRelative, PCB_ACTIONS::properties, PCB_ACTIONS::remove, PCB_ACTIONS::rotateCcw, PCB_ACTIONS::rotateCw, GENERAL_COLLECTOR::Tracks, wxPoint::x, and wxPoint::y.

178 {
179  // Find the selection tool, so they can cooperate
180  m_selectionTool = static_cast<SELECTION_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveSelection" ) );
181 
182  if( !m_selectionTool )
183  {
184  DisplayError( NULL, wxT( "pcbnew.InteractiveSelection tool is not available" ) );
185  return false;
186  }
187 
188  auto editingModuleCondition = [ this ] ( const SELECTION& aSelection ) {
189  return m_editModules;
190  };
191 
192  auto singleModuleCondition = SELECTION_CONDITIONS::OnlyType( PCB_MODULE_T )
194 
195  // Add context menu entries that are displayed when selection tool is active
208 
209  // Mirror only available in modedit
210  menu.AddItem( PCB_ACTIONS::mirror, editingModuleCondition && SELECTION_CONDITIONS::NotEmpty );
211 
212  // Footprint actions
214  singleModuleCondition );
216  singleModuleCondition );
217 
218  m_offset.x = 0;
219  m_offset.y = 0;
220 
221  return true;
222 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
static TOOL_ACTION editActivate
Activation of the edit tool.
Definition: pcb_actions.h:87
static const KICAD_T Tracks[]
A scan list for only TRACKS.
Definition: collectors.h:294
Class SELECTION_TOOL.
CONDITIONAL_MENU & GetMenu()
Function GetMenu.
Definition: tool_menu.cpp:49
TOOL_MENU & GetToolMenu()
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:102
static TOOL_ACTION mirror
Mirroring of selected items.
Definition: pcb_actions.h:99
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
wxPoint m_offset
Offset from the dragged item's center (anchor)
Definition: edit_tool.h:142
static SELECTION_CONDITION Count(int aNumber)
Function Count Creates a functor that tests if the number of selected items is equal to the value giv...
static bool NotEmpty(const SELECTION &aSelection)
Function NotEmpty Tests if there are any items selected.
static TOOL_ACTION moveExact
Activation of the exact move tool.
Definition: pcb_actions.h:108
static TOOL_ACTION duplicate
Activation of the duplication tool.
Definition: pcb_actions.h:111
class MODULE, a footprint
Definition: typeinfo.h:101
static TOOL_ACTION rotateCw
Rotation of selected objects clockwise.
Definition: pcb_actions.h:90
static SELECTION_CONDITION OnlyTypes(const std::vector< KICAD_T > &aTypes)
Function OnlyTypes Creates a functor that tests if the selected items are only of given types...
static TOOL_ACTION createArray
Tool for creating an array of objects.
Definition: pcb_actions.h:287
static TOOL_ACTION exchangeFootprints
Exchange footprints of modules.
Definition: pcb_actions.h:117
bool m_editModules
Definition: pcb_tool.h:128
static TOOL_ACTION rotateCcw
Rotation of selected objects counter-clockwise.
Definition: pcb_actions.h:93
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:96
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition=SELECTION_CONDITIONS::ShowAlways, int aOrder=ANY_ORDER)
Function AddItem()
static TOOL_ACTION editFootprintInFpEditor
Definition: pcb_actions.h:371
static SELECTION_CONDITION OnlyType(KICAD_T aType)
Function OnlyType Creates a functor that tests if the selected items are only of given type...
static TOOL_ACTION positionRelative
Activation of the position relative tool.
Definition: pcb_actions.h:228
static TOOL_ACTION remove
Deleting a BOARD_ITEM.
Definition: pcb_actions.h:120
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:69
bool EDIT_TOOL::invokeInlineRouter ( )
private

Definition at line 225 of file edit_tool.cpp.

References TOOL_MANAGER::FindTool(), PNS::ROUTING_SETTINGS::InlineDragEnabled(), TOOL_BASE::m_toolMgr, PNS::TOOL_BASE::PNSSettings(), PCB_ACTIONS::routerInlineDrag, TOOL_MANAGER::RunAction(), and PNS::theRouter.

Referenced by Main().

228 {
229  TRACK* track = uniqueSelected<TRACK>();
230  VIA* via = uniqueSelected<VIA>();
231 
232  if( track || via )
233  {
234  ROUTER_TOOL* theRouter = static_cast<ROUTER_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveRouter" ) );
235  assert( theRouter );
236 
237  if( !theRouter->PNSSettings().InlineDragEnabled() )
238  return false;
239 
241  return true;
242  }
243 
244  return false;
245 }
TOOL_BASE * FindTool(int aId) const
Function FindTool() Searches for a tool with given ID.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
const ROUTING_SETTINGS & PNSSettings() const
Definition: pns_tool_base.h:54
static TOOL_ACTION routerInlineDrag
Activation of the Push and Shove router (inline dragging mode)
Definition: pcb_actions.h:198
static ROUTER * theRouter
Definition: pns_router.cpp:59
int EDIT_TOOL::Main ( const TOOL_EVENT aEvent)

Function Main()

Main loop in which events are handled.

Parameters
aEventis the handled event.

Definition at line 248 of file edit_tool.cpp.

References TOOL_INTERACTIVE::Activate(), GRID_HELPER::Align(), GRID_HELPER::BestDragOrigin(), GRID_HELPER::BestSnapAnchor(), BUT_LEFT, SELECTION_TOOL::CheckLock(), PCB_TOOL::controls(), PCB_ACTIONS::duplicate, PCB_ACTIONS::editActivate, KIGFX::VIEW_CONTROLS::ForceCursorPosition(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), getModificationPoint(), BOARD_ITEM::GetPosition(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), invokeInlineRouter(), SELECTION::IsHover(), m_commit, m_cursor, m_dragging, m_offset, m_selectionTool, TOOL_BASE::m_toolMgr, PCB_ACTIONS::moveExact, PCB_ACTIONS::remove, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_DEFAULT, SELECTION_DELETABLE, SELECTION_LOCK_OVERRIDE, SELECTION_LOCKED, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, KIGFX::VIEW_CONTROLS::SetAutoPan(), GRID_HELPER::SetAuxAxes(), BOARD_ITEM::SetPosition(), KIGFX::VIEW_CONTROLS::SetSnapping(), KIGFX::VIEW_CONTROLS::ShowCursor(), TA_UNDO_REDO_PRE, TC_COMMAND, TC_MOUSE, KIGFX::VIEW::Update(), updateRatsnest(), TOOL_INTERACTIVE::Wait(), KIGFX::VIEW_CONTROLS::WarpCursor(), wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by Duplicate(), and SetTransitions().

249 {
251  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
252 
253  VECTOR2I originalCursorPos = controls->GetCursorPosition();
254 
255  // Be sure that there is at least one item that we can modify. If nothing was selected before,
256  // try looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection)
258 
259  if( selection.Empty() )
260  return 0;
261 
262  bool unselect = selection.IsHover();
263 
264  Activate();
265 
266  m_dragging = false; // Are selected items being dragged?
267  bool restore = false; // Should items' state be restored when finishing the tool?
268  bool lockOverride = false;
269 
270  controls->ShowCursor( true );
271  controls->SetSnapping( true );
272  controls->SetAutoPan( true );
273 
274  // cumulative translation
275  wxPoint totalMovement( 0, 0 );
276 
277  GRID_HELPER grid( editFrame );
278  OPT_TOOL_EVENT evt = aEvent;
279 
280  // Main loop: keep receiving events
281  do
282  {
283  if( evt->IsAction( &PCB_ACTIONS::editActivate )
284  || evt->IsMotion() || evt->IsDrag( BUT_LEFT ) )
285  {
286  if( selection.Empty() )
287  break;
288 
289  BOARD_ITEM* curr_item = static_cast<BOARD_ITEM*>( selection.Front() );
290 
291  if( m_dragging && evt->Category() == TC_MOUSE )
292  {
293  m_cursor = grid.BestSnapAnchor( evt->Position(), curr_item );
294  controls->ForceCursorPosition( true, m_cursor );
295 
296  wxPoint movement = wxPoint( m_cursor.x, m_cursor.y ) - curr_item->GetPosition();
297  totalMovement += movement;
298 
299  // Drag items to the current cursor position
300  for( auto item : selection )
301  {
302  static_cast<BOARD_ITEM*>( item )->Move( movement + m_offset );
303  }
304 
305  updateRatsnest( true );
306  }
307  else if( !m_dragging ) // Prepare to start dragging
308  {
309  if( !invokeInlineRouter() )
310  {
312 
313  if( selection.Empty() )
314  break;
315 
316  // deal with locked items (override lock or abort the operation)
318 
319  if( lockFlags == SELECTION_LOCKED )
320  break;
321  else if( lockFlags == SELECTION_LOCK_OVERRIDE )
322  lockOverride = true;
323 
324  // Save items, so changes can be undone
325  for( auto item : selection )
326  m_commit->Modify( item );
327 
328  m_cursor = controls->GetCursorPosition();
329 
330  if( selection.Size() == 1 )
331  {
332  // Set the current cursor position to the first dragged item origin, so the
333  // movement vector could be computed later
334  m_cursor = grid.BestDragOrigin( originalCursorPos, curr_item );
335  grid.SetAuxAxes( true, m_cursor );
336  }
337  else
338  {
339  m_cursor = grid.Align( m_cursor );
340  }
341 
342  controls->ForceCursorPosition( true, m_cursor );
343  controls->WarpCursor( m_cursor, true );
344 
345  VECTOR2I o = VECTOR2I( curr_item->GetPosition() );
346  m_offset.x = o.x - m_cursor.x;
347  m_offset.y = o.y - m_cursor.y;
348 
349  controls->SetAutoPan( true );
350  m_dragging = true;
351  }
352  }
353 
355  }
356 
357  else if( evt->IsCancel() || evt->IsActivate() )
358  {
359  restore = true; // Cancelling the tool means that items have to be restored
360  break; // Finish
361  }
362 
363  else if( evt->Action() == TA_UNDO_REDO_PRE )
364  {
365  unselect = true;
366  break;
367  }
368 
369  // Dispatch TOOL_ACTIONs
370  else if( evt->Category() == TC_COMMAND )
371  {
372  wxPoint modPoint = getModificationPoint( selection );
373 
374  if( evt->IsAction( &PCB_ACTIONS::remove ) )
375  {
376  // exit the loop, as there is no further processing for removed items
377  break;
378  }
379  else if( evt->IsAction( &PCB_ACTIONS::duplicate ) )
380  {
381  // On duplicate, stop moving this item
382  // The duplicate tool should then select the new item and start
383  // a new move procedure
384  break;
385  }
386  else if( evt->IsAction( &PCB_ACTIONS::moveExact ) )
387  {
388  // Can't do this, because the selection will then contain
389  // stale pointers and it will all go horribly wrong...
390  //editFrame->RestoreCopyFromUndoList( dummy );
391  //
392  // So, instead, reset the position manually
393  for( auto item : selection )
394  {
395  BOARD_ITEM* i = static_cast<BOARD_ITEM*>( item );
396  i->SetPosition( i->GetPosition() - totalMovement );
397 
398  // And what about flipping and rotation?
399  // for now, they won't be undone, but maybe that is how
400  // it should be, so you can flip and move exact in the
401  // same action?
402  }
403 
404  // This causes a double event, so we will get the dialogue
405  // correctly, somehow - why does Rotate not?
406  //MoveExact( aEvent );
407  break; // exit the loop - we move exactly, so we have finished moving
408  }
409 
410  if( m_dragging )
411  {
412  // Update dragging offset (distance between cursor and the first dragged item)
413  m_offset = static_cast<BOARD_ITEM*>( selection.Front() )->GetPosition() - modPoint;
414  getView()->Update( &selection );
415  updateRatsnest( true );
416  }
417  }
418 
419  else if( evt->IsMouseUp( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) )
420  {
421  if( !lockOverride )
422  break; // Finish
423 
424  lockOverride = false;
425  }
426  } while( ( evt = Wait() ) ); //Should be assignment not equality test
427 
428  getModel<BOARD>()->GetConnectivity()->ClearDynamicRatsnest();
429 
430  controls->ForceCursorPosition( false );
431  controls->ShowCursor( false );
432  controls->SetSnapping( false );
433  controls->SetAutoPan( false );
434 
435  m_dragging = false;
436  m_offset.x = 0;
437  m_offset.y = 0;
438 
439  if( unselect || restore )
441 
442  if( restore )
443  m_commit->Revert();
444  else
445  m_commit->Push( _( "Drag" ) );
446 
447  return 0;
448 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
wxPoint getModificationPoint(const SELECTION &aSelection)
Returns the right modification point (e.g.
Definition: edit_tool.cpp:1167
virtual void ShowCursor(bool aEnabled)
Function ShowCursor() Enables or disables display of cursor.
VECTOR2I m_cursor
Last cursor position (needed for getModificationPoint() to avoid changes of edit reference point)...
Definition: edit_tool.h:146
static TOOL_ACTION editActivate
Activation of the edit tool.
Definition: pcb_actions.h:87
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
virtual void SetPosition(const wxPoint &aPos)=0
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
virtual const wxPoint & GetPosition() const =0
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
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
wxPoint m_offset
Offset from the dragged item's center (anchor)
Definition: edit_tool.h:142
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
static TOOL_ACTION moveExact
Activation of the exact move tool.
Definition: pcb_actions.h:108
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:124
static TOOL_ACTION duplicate
Activation of the duplication tool.
Definition: pcb_actions.h:111
virtual void WarpCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false) const =0
Function WarpCursor() If enabled (.
virtual VECTOR2D GetCursorPosition() const =0
Function GetCursorPosition() Returns the current cursor position in world coordinates.
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
SELECTION_LOCK_FLAGS
Definition: selection.h:184
Class VIEW_CONTROLS is an interface for classes handling user events controlling the view behaviour (...
Definition: view_controls.h:94
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Function ForceCursorPosition() Places the cursor immediately at a given point.
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
bool invokeInlineRouter()
Definition: edit_tool.cpp:225
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
void updateRatsnest(bool aRedraw)
Updates ratsnest for selected items.
Definition: edit_tool.cpp:1154
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
Common, abstract interface for edit frames.
bool IsHover() const
Definition: selection.h:66
void Activate()
Function Activate() Runs the tool.
static TOOL_ACTION remove
Deleting a BOARD_ITEM.
Definition: pcb_actions.h:120
int EDIT_TOOL::MeasureTool ( const TOOL_EVENT aEvent)

Launches a tool to measure between points

Definition at line 1041 of file edit_tool.cpp.

References TOOL_INTERACTIVE::Activate(), KIGFX::VIEW::Add(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), PCB_TOOL::controls(), PCB_TOOL::EditingModules(), PCB_TOOL::frame(), KIGFX::GEOMETRY, KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_BASE::GetManager(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), ID_MODEDIT_MEASUREMENT_TOOL, ID_PCB_MEASUREMENT_TOOL, MD_CTRL, TOOL_MANAGER::PassEvent(), KIGFX::VIEW::Remove(), KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER::SetAngleSnap(), KIGFX::VIEW_CONTROLS::SetAutoPan(), KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER::SetEnd(), EDA_DRAW_FRAME::SetNoToolSelected(), KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER::SetOrigin(), KIGFX::VIEW_CONTROLS::SetSnapping(), PCB_BASE_FRAME::SetToolID(), KIGFX::VIEW::SetVisible(), KIGFX::VIEW_CONTROLS::ShowCursor(), KIGFX::VIEW::Update(), PCB_TOOL::view(), and TOOL_INTERACTIVE::Wait().

Referenced by SetTransitions().

1042 {
1043  auto& view = *getView();
1044  auto& controls = *getViewControls();
1045 
1046  Activate();
1049  wxCURSOR_PENCIL, _( "Measure distance" ) );
1050 
1052 
1053  KIGFX::PREVIEW::RULER_ITEM ruler( twoPtMgr );
1054 
1055  view.Add( &ruler );
1056  view.SetVisible( &ruler, false );
1057 
1058  bool originSet = false;
1059 
1060  controls.ShowCursor( true );
1061  controls.SetSnapping( true );
1062 
1063  while( auto evt = Wait() )
1064  {
1065  const VECTOR2I cursorPos = controls.GetCursorPosition();
1066 
1067  if( evt->IsCancel() || evt->IsActivate() )
1068  {
1069  break;
1070  }
1071 
1072  // click or drag starts
1073  else if( !originSet &&
1074  ( evt->IsDrag( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) )
1075  {
1076  if( !evt->IsDrag( BUT_LEFT ) )
1077  {
1078  twoPtMgr.SetOrigin( cursorPos );
1079  twoPtMgr.SetEnd( cursorPos );
1080  }
1081 
1082  controls.CaptureCursor( true );
1083  controls.SetAutoPan( true );
1084 
1085  originSet = true;
1086  }
1087 
1088  else if( !originSet && evt->IsMotion() )
1089  {
1090  // make sure the origin is set before a drag starts
1091  // otherwise you can miss a step
1092  twoPtMgr.SetOrigin( cursorPos );
1093  twoPtMgr.SetEnd( cursorPos );
1094  }
1095 
1096  // second click or mouse up after drag ends
1097  else if( originSet &&
1098  ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) )
1099  {
1100  originSet = false;
1101 
1102  controls.SetAutoPan( false );
1103  controls.CaptureCursor( false );
1104 
1105  view.SetVisible( &ruler, false );
1106  }
1107 
1108  // move or drag when origin set updates rules
1109  else if( originSet &&
1110  ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
1111  {
1112  twoPtMgr.SetAngleSnap( evt->Modifier( MD_CTRL ) );
1113  twoPtMgr.SetEnd( cursorPos );
1114 
1115  view.SetVisible( &ruler, true );
1116  view.Update( &ruler, KIGFX::GEOMETRY );
1117  }
1118 
1119  else if( evt->IsClick( BUT_RIGHT ) )
1120  {
1121  GetManager()->PassEvent();
1122  }
1123  }
1124 
1125  view.SetVisible( &ruler, false );
1126  view.Remove( &ruler );
1127 
1128  frame()->SetNoToolSelected();
1129 
1130  return 0;
1131 }
virtual void ShowCursor(bool aEnabled)
Function ShowCursor() Enables or disables display of cursor.
KIGFX::VIEW * view() const
Definition: pcb_tool.h:123
virtual void SetToolID(int aId, int aCursor, const wxString &aToolMsg) override
Function SetToolID sets the tool command ID to aId and sets the cursor to aCursor.
Class TWO_POINT_GEOMETRY_MANAGER.
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.
void PassEvent()
Allows a tool to pass the already handled event to the next tool on the stack.
Definition: tool_manager.h:336
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:124
virtual VECTOR2D GetCursorPosition() const =0
Function GetCursorPosition() Returns the current cursor position in world coordinates.
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:125
void SetOrigin(const VECTOR2I &aOrigin)
Set the origin of the ruler (the fixed end)
Class RULER_ITEM.
Definition: ruler_item.h:43
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
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
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
bool EditingModules() const
Definition: pcb_tool.h:91
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
TOOL_MANAGER * GetManager() const
Function GetManager() Returns the instance of TOOL_MANAGER that takes care of the tool...
Definition: tool_base.h:144
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1331
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
PCB_EDIT_FRAME::OnResetModuleTextSizes PCB_EDIT_FRAME::OnSelectOptionToolbar PCB_EDIT_FRAME::OnSelectOptionToolbar PCB_EDIT_FRAME::OnSelectOptionToolbar PCB_EDIT_FRAME::OnSelectOptionToolbar ID_PCB_MEASUREMENT_TOOL
Definition: pcbframe.cpp:262
void SetEnd(const VECTOR2I &aEnd)
Set the current end of the rectangle (the end that moves with the cursor.
Color has changed.
Definition: view_item.h:57
int EDIT_TOOL::Mirror ( const TOOL_EVENT aEvent)

Function Mirror.

Mirrors the current selection. The mirror axis passes through the current point.

Definition at line 574 of file edit_tool.cpp.

References SELECTION_TOOL::CheckLock(), getModificationPoint(), m_commit, m_dragging, m_selectionTool, TOOL_BASE::m_toolMgr, EDGE_MODULE::Mirror(), TEXTE_MODULE::Mirror(), mirrorPadX(), PCB_MODULE_EDGE_T, PCB_MODULE_TEXT_T, PCB_PAD_T, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_LOCKED, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, and updateRatsnest().

Referenced by SetTransitions().

575 {
576  const auto& selection = m_selectionTool->RequestSelection();
577 
579  return 0;
580 
581  if( selection.Empty() )
582  return 0;
583 
584  wxPoint mirrorPoint = getModificationPoint( selection );
585 
586  for( auto item : selection )
587  {
588  // only modify items we can mirror
589  switch( item->Type() )
590  {
591  case PCB_MODULE_EDGE_T:
592  case PCB_MODULE_TEXT_T:
593  case PCB_PAD_T:
594  m_commit->Modify( item );
595  break;
596  default:
597  continue;
598  }
599 
600  // modify each object as necessary
601  switch( item->Type() )
602  {
603  case PCB_MODULE_EDGE_T:
604  {
605  auto& edge = static_cast<EDGE_MODULE&>( *item );
606  edge.Mirror( mirrorPoint, false );
607  break;
608  }
609 
610  case PCB_MODULE_TEXT_T:
611  {
612  auto& modText = static_cast<TEXTE_MODULE&>( *item );
613  modText.Mirror( mirrorPoint, false );
614  break;
615  }
616 
617  case PCB_PAD_T:
618  {
619  auto& pad = static_cast<D_PAD&>( *item );
620  mirrorPadX( pad, mirrorPoint );
621  break;
622  }
623 
624  default:
625  // it's likely the commit object is wrong if you get here
626  assert( false );
627  break;
628  }
629  }
630 
631  if( !m_dragging )
632  m_commit->Push( _( "Mirror" ) );
633  else
634  updateRatsnest( true );
635 
636  if( selection.IsHover() )
638 
640 
641  return 0;
642 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
wxPoint getModificationPoint(const SELECTION &aSelection)
Returns the right modification point (e.g.
Definition: edit_tool.cpp:1167
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:106
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
void Mirror(const wxPoint aCentre, bool aMirrorAroundXAxis)
Mirror an edge of the footprint.
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
void updateRatsnest(bool aRedraw)
Updates ratsnest for selected items.
Definition: edit_tool.cpp:1154
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:105
void Mirror(const wxPoint &aCentre, bool aMirrorAroundXAxis)
Mirror text position in footprint edition the text itself is not mirrored, and the layer not modified...
static void mirrorPadX(D_PAD &aPad, const wxPoint &aMirrorPoint)
Mirror a pad in the vertical axis passing through a point.
Definition: edit_tool.cpp:554
int EDIT_TOOL::MoveExact ( const TOOL_EVENT aEvent)

Function MoveExact()

Invokes a dialog box to allow moving of the item by an exact amount.

Definition at line 718 of file edit_tool.cpp.

References ANCHOR_CENTER_FOOTPRINT, ANCHOR_FROM_LIBRARY, ANCHOR_TOP_LEFT_PAD, SELECTION_TOOL::CheckLock(), MOVE_PARAMETERS::editingFootprint, PCB_BASE_FRAME::GetAuxOrigin(), EDA_ITEM::GetBoundingBox(), EDA_RECT::GetCenter(), MODULE::GetFootprintRect(), PCB_BASE_FRAME::GetGridOrigin(), BOARD_ITEM::GetPosition(), EDA_RECT::GetPosition(), MODULE::GetPosition(), PCB_BASE_FRAME::GetScreen(), MODULE::GetTopLeftPad(), TOOL_BASE::getView(), m_commit, m_dragging, PCB_TOOL::m_editModules, BASE_SCREEN::m_O_Curseur, m_selectionTool, TOOL_BASE::m_toolMgr, mod, PAD_ATTRIB_SMD, PCB_MODULE_T, PCB_PAD_T, RELATIVE_TO_CURRENT_POSITION, RELATIVE_TO_DRILL_PLACE_ORIGIN, RELATIVE_TO_GRID_ORIGIN, RELATIVE_TO_SHEET_ORIGIN, RELATIVE_TO_USER_ORIGIN, SELECTION_TOOL::RequestSelection(), Rotate(), TOOL_MANAGER::RunAction(), SELECTION_LOCKED, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, EDA_ITEM::Type(), KIGFX::VIEW::Update(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by SetTransitions().

719 {
720  const auto& selection = m_selectionTool->RequestSelection();
721 
723  return 0;
724 
725  if( selection.Empty() )
726  return 0;
727 
728  PCB_BASE_FRAME* editFrame = getEditFrame<PCB_BASE_FRAME>();
729 
730  MOVE_PARAMETERS params;
732 
733  DIALOG_MOVE_EXACT dialog( editFrame, params );
734  int ret = dialog.ShowModal();
735 
736  if( ret == wxID_OK )
737  {
738  VECTOR2I rp = selection.GetCenter();
739  wxPoint rotPoint( rp.x, rp.y );
740 
741  // Begin at the center of the selection determined above
742  wxPoint anchorPoint = rotPoint;
743 
744  // If the anchor is not ANCHOR_FROM_LIBRARY then the user applied an override.
745  // Also run through this block if only one item is slected because it may be a module,
746  // in which case we want something different than the center of the selection
747  if( ( params.anchor != ANCHOR_FROM_LIBRARY ) || ( selection.GetSize() == 1 ) )
748  {
749  BOARD_ITEM* topLeftItem = static_cast<BOARD_ITEM*>( selection.GetTopLeftModule() );
750 
751  // no module found if the GetTopLeftModule() returns null, retry for
752  if( topLeftItem == nullptr )
753  {
754  topLeftItem = static_cast<BOARD_ITEM*>( selection.GetTopLeftItem() );
755  anchorPoint = topLeftItem->GetPosition();
756  }
757 
758  if( topLeftItem->Type() == PCB_MODULE_T )
759  {
760  // Cast to module to allow access to the pads
761  MODULE* mod = static_cast<MODULE*>( topLeftItem );
762 
763  switch( params.anchor )
764  {
765  case ANCHOR_FROM_LIBRARY:
766  anchorPoint = mod->GetPosition();
767  break;
768  case ANCHOR_TOP_LEFT_PAD:
769  topLeftItem = mod->GetTopLeftPad();
770  break;
772  anchorPoint = mod->GetFootprintRect().GetCenter();
773  break;
774  }
775  }
776 
777  if( topLeftItem->Type() == PCB_PAD_T )
778  {
779  if( static_cast<D_PAD*>( topLeftItem )->GetAttribute() == PAD_ATTRIB_SMD )
780  {
781  // Use the top left corner of SMD pads as an anchor instead of the center
782  anchorPoint = topLeftItem->GetBoundingBox().GetPosition();
783  }
784  else
785  {
786  anchorPoint = topLeftItem->GetPosition();
787  }
788  }
789  }
790 
791  wxPoint origin;
792 
793  switch( params.origin )
794  {
796  origin = editFrame->GetScreen()->m_O_Curseur;
797  break;
798 
800  origin = editFrame->GetGridOrigin();
801  break;
802 
804  origin = editFrame->GetAuxOrigin();
805  break;
806 
808  origin = wxPoint( 0, 0 );
809  break;
810 
812  // relative movement means that only the translation values should be used:
813  // -> set origin and anchor to zero
814  origin = wxPoint( 0, 0 );
815  anchorPoint = wxPoint( 0, 0 );
816  break;
817  }
818 
819  wxPoint finalMoveVector = params.translation + origin - anchorPoint;
820 
821  // Make sure the rotation is from the right reference point
822  rotPoint += finalMoveVector;
823 
824  for( auto item : selection )
825  {
826  m_commit->Modify( item );
827  static_cast<BOARD_ITEM*>( item )->Move( finalMoveVector );
828  static_cast<BOARD_ITEM*>( item )->Rotate( rotPoint, params.rotation );
829 
830  if( !m_dragging )
831  getView()->Update( item );
832  }
833 
834  m_commit->Push( _( "Move exact" ) );
835 
836  if( selection.IsHover() )
838 
840  }
841 
842  return 0;
843 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
int Rotate(const TOOL_EVENT &aEvent)
Function Rotate()
Definition: edit_tool.cpp:498
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
const wxPoint & GetPosition() const override
Definition: class_module.h:155
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:59
const wxPoint & GetGridOrigin() const override
Function GetGridOrigin returns the absolute coordinates of the origin of the snap grid...
virtual const wxPoint & GetPosition() const =0
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
wxPoint m_O_Curseur
Relative Screen cursor coordinate (on grid) in user units.
const wxPoint & GetAuxOrigin() const override
Function GetAuxOrigin returns the origin of the axis used for plotting and various exports...
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
class MODULE, a footprint
Definition: typeinfo.h:101
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
EDA_RECT GetFootprintRect() const
Function GetFootprintRect() Returns the area of the module footprint excluding any text...
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1385
D_PAD * GetTopLeftPad()
const wxPoint & GetPosition() const
bool m_editModules
Definition: pcb_tool.h:128
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
PCB_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
#define mod(a, n)
Definition: greymap.cpp:24
class PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer...
const wxPoint GetCenter() const
int EDIT_TOOL::Properties ( const TOOL_EVENT aEvent)

Function Edit()

Displays properties window for the selected object.

Definition at line 451 of file edit_tool.cpp.

References DIALOG_TRACK_VIA_PROPERTIES::Apply(), EDA_ITEM::ClearFlags(), EDA_ITEM::GetFlags(), m_commit, m_selectionTool, TOOL_BASE::m_toolMgr, PCB_BASE_EDIT_FRAME::OnEditItemRequest(), SELECTION_CONDITIONS::OnlyTypes(), SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_DELETABLE, SELECTION_EDITABLE, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, EDA_ITEM::SetFlags(), and GENERAL_COLLECTOR::Tracks.

Referenced by SetTransitions().

452 {
453  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
454 
456 
457  if( selection.Empty() )
458  return 0;
459 
460  // Tracks & vias are treated in a special way:
462  {
463  DIALOG_TRACK_VIA_PROPERTIES dlg( editFrame, selection );
464 
465  if( dlg.ShowModal() )
466  {
467  dlg.Apply( *m_commit );
468  m_commit->Push( _( "Edit track/via properties" ) );
469  }
470  }
471  else if( selection.Size() == 1 ) // Properties are displayed when there is only one item selected
472  {
473  // Display properties dialog
474  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( selection.Front() );
475 
476  // Some of properties dialogs alter pointers, so we should deselect them
478 
479  // Store flags, so they can be restored later
480  STATUS_FLAGS flags = item->GetFlags();
481  item->ClearFlags();
482 
483  // Do not handle undo buffer, it is done by the properties dialogs @todo LEGACY
484  // Display properties dialog provided by the legacy canvas frame
485  editFrame->OnEditItemRequest( NULL, item );
486 
488  item->SetFlags( flags );
489  }
490 
491  if( selection.IsHover() )
493 
494  return 0;
495 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
STATUS_FLAGS GetFlags() const
Definition: base_struct.h:255
static const KICAD_T Tracks[]
A scan list for only TRACKS.
Definition: collectors.h:294
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
virtual void OnEditItemRequest(wxDC *aDC, BOARD_ITEM *aItem)=0
Function OnEditItemRequest Install the corresponding dialog editor for the given item.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:253
static SELECTION_CONDITION OnlyTypes(const std::vector< KICAD_T > &aTypes)
Function OnlyTypes Creates a functor that tests if the selected items are only of given types...
unsigned STATUS_FLAGS
Definition: base_struct.h:144
Common, abstract interface for edit frames.
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:254
int EDIT_TOOL::Remove ( const TOOL_EVENT aEvent)

Function Remove()

Deletes currently selected items. The rotation point is the current cursor position.

Definition at line 680 of file edit_tool.cpp.

References ACTIONS::ALT, SELECTION_TOOL::CheckLock(), m_commit, m_selectionTool, TOOL_BASE::m_toolMgr, TOOL_EVENT::Parameter(), SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectConnection, SELECTION_DELETABLE, SELECTION_LOCKED, SELECTION_SANITIZE_PADS, and PCB_ACTIONS::selectionClear.

Referenced by SetTransitions().

681 {
682  // get a copy instead of reference (as we're going to clear the selectio before removing items)
684 
686  return 0;
687 
688  if( selection.Empty() )
689  return 0;
690 
691  // is this "alternative" remove?
692  const bool isAlt = aEvent.Parameter<intptr_t>() ==
693  (int) PCB_ACTIONS::REMOVE_FLAGS::ALT;
694 
695  // in "alternative" mode, deletion is not just a simple list
696  // of selected items, it is:
697  // - whole tracks, not just segments
698  if( isAlt && selection.IsHover() )
699  {
702  }
703 
704  // As we are about to remove items, they have to be removed from the selection first
706 
707  for( auto item : selection )
708  {
709  m_commit->Remove( item );
710  }
711 
712  m_commit->Push( _( "Delete" ) );
713 
714  return 0;
715 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
if(dlg.ShowModal()==wxID_OK)
Definition: selcolor.cpp:75
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
static TOOL_ACTION selectConnection
Selects a connection between junctions.
Definition: pcb_actions.h:68
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:373
Class PCB_ACTIONS.
Definition: pcb_actions.h:42
void EDIT_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 168 of file edit_tool.cpp.

References m_commit, m_dragging, and TOOL_BASE::RUN.

169 {
170  m_dragging = false;
171 
172  if( aReason != RUN )
173  m_commit.reset( new BOARD_COMMIT( this ) );
174 }
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
Tool is invoked after being inactive.
Definition: tool_base.h:82
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
int EDIT_TOOL::Rotate ( const TOOL_EVENT aEvent)

Function Rotate()

Rotates currently selected items.

Definition at line 498 of file edit_tool.cpp.

References SELECTION_TOOL::CheckLock(), TOOL_EVT_UTILS::GetEventRotationAngle(), getModificationPoint(), m_commit, m_dragging, m_offset, m_selectionTool, TOOL_BASE::m_toolMgr, SELECTION_TOOL::RequestSelection(), TOOL_MANAGER::RunAction(), SELECTION_LOCKED, PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionModified, and updateRatsnest().

Referenced by MoveExact(), and SetTransitions().

499 {
500  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
501 
502  const auto& selection = m_selectionTool->RequestSelection();
503 
504  if( selection.Empty() )
505  return 0;
506 
508  return 0;
509 
510  wxPoint modPoint = getModificationPoint( selection );
511  const int rotateAngle = TOOL_EVT_UTILS::GetEventRotationAngle( *editFrame, aEvent );
512 
513  for( auto item : selection )
514  {
515  m_commit->Modify( item );
516  static_cast<BOARD_ITEM*>( item )->Rotate( modPoint, rotateAngle );
517  }
518 
519  // Update the dragging point offset
520  m_offset = static_cast<BOARD_ITEM*>( selection.Front() )->GetPosition() - modPoint;
521 
522  if( !m_dragging )
523  m_commit->Push( _( "Rotate" ) );
524  else
525  updateRatsnest( true );
526 
527  if( selection.IsHover() )
529 
531 
532  return 0;
533 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
wxPoint getModificationPoint(const SELECTION &aSelection)
Returns the right modification point (e.g.
Definition: edit_tool.cpp:1167
int Rotate(const TOOL_EVENT &aEvent)
Function Rotate()
Definition: edit_tool.cpp:498
SELECTION & RequestSelection(int aFlags=SELECTION_DEFAULT)
Function RequestSelection()
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
std::unique_ptr< BOARD_COMMIT > m_commit
Definition: edit_tool.h:207
SELECTION_LOCK_FLAGS CheckLock()
Checks if the user has agreed to modify locked items for the given selection.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
wxPoint m_offset
Offset from the dragged item's center (anchor)
Definition: edit_tool.h:142
static TOOL_ACTION selectionModified
Modified selection notification.
Definition: pcb_actions.h:105
bool m_dragging
Flag determining if anything is being dragged right now
Definition: edit_tool.h:139
void updateRatsnest(bool aRedraw)
Updates ratsnest for selected items.
Definition: edit_tool.cpp:1154
Common, abstract interface for edit frames.
int GetEventRotationAngle(const PCB_BASE_EDIT_FRAME &aFrame, const TOOL_EVENT &aEvt)
Function getEventRotationAngle()
void TOOL_INTERACTIVE::RunMainStack ( std::function< void()>  aFunc)
inherited

Function RunMainStack()

Calls a function using the main stack.

Parameters
aFuncis the function to be calls.

Definition at line 78 of file tool_interactive.cpp.

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

Referenced by DRAWING_TOOL::PlaceText().

79 {
80  m_toolMgr->RunMainStack( this, std::move( aFunc ) );
81 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
void RunMainStack(TOOL_BASE *aTool, std::function< void()> aFunc)
void TOOL_INTERACTIVE::SetContextMenu ( CONTEXT_MENU aMenu,
CONTEXT_MENU_TRIGGER  aTrigger = CMENU_BUTTON 
)
inherited

Function SetContextMenu()

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

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

Definition at line 67 of file tool_interactive.cpp.

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

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

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

Function SetEditModules()

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

Parameters
aEnableddecides if the mode should be enabled.

Definition at line 86 of file pcb_tool.h.

References PCB_TOOL::m_editModules.

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

Sets up handlers for various events.

Reimplemented from TOOL_BASE.

Definition at line 1134 of file edit_tool.cpp.

References CreateArray(), PCB_ACTIONS::createArray, Duplicate(), PCB_ACTIONS::duplicate, PCB_ACTIONS::duplicateIncrement, PCB_ACTIONS::editActivate, editFootprintInFpEditor(), PCB_ACTIONS::editFootprintInFpEditor, PCB_ACTIONS::exchangeFootprints, ExchangeFootprints(), Flip(), PCB_ACTIONS::flip, TOOL_INTERACTIVE::Go(), Main(), MeasureTool(), PCB_ACTIONS::measureTool, Mirror(), PCB_ACTIONS::mirror, PCB_ACTIONS::moveExact, MoveExact(), Properties(), PCB_ACTIONS::properties, Remove(), PCB_ACTIONS::remove, PCB_ACTIONS::removeAlt, Rotate(), PCB_ACTIONS::rotateCcw, and PCB_ACTIONS::rotateCw.

1135 {
1136  Go( &EDIT_TOOL::Main, PCB_ACTIONS::editActivate.MakeEvent() );
1137  Go( &EDIT_TOOL::Rotate, PCB_ACTIONS::rotateCw.MakeEvent() );
1138  Go( &EDIT_TOOL::Rotate, PCB_ACTIONS::rotateCcw.MakeEvent() );
1139  Go( &EDIT_TOOL::Flip, PCB_ACTIONS::flip.MakeEvent() );
1140  Go( &EDIT_TOOL::Remove, PCB_ACTIONS::remove.MakeEvent() );
1141  Go( &EDIT_TOOL::Remove, PCB_ACTIONS::removeAlt.MakeEvent() );
1147  Go( &EDIT_TOOL::Mirror, PCB_ACTIONS::mirror.MakeEvent() );
1151 }
int Main(const TOOL_EVENT &aEvent)
Function Main()
Definition: edit_tool.cpp:248
int Properties(const TOOL_EVENT &aEvent)
Function Edit()
Definition: edit_tool.cpp:451
int Rotate(const TOOL_EVENT &aEvent)
Function Rotate()
Definition: edit_tool.cpp:498
int ExchangeFootprints(const TOOL_EVENT &aEvent)
Function ExchangeFootprints()
Definition: edit_tool.cpp:1009
static TOOL_ACTION editActivate
Activation of the edit tool.
Definition: pcb_actions.h:87
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:102
static TOOL_ACTION removeAlt
Definition: pcb_actions.h:121
static TOOL_ACTION mirror
Mirroring of selected items.
Definition: pcb_actions.h:99
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
int Mirror(const TOOL_EVENT &aEvent)
Function Mirror.
Definition: edit_tool.cpp:574
static TOOL_ACTION moveExact
Activation of the exact move tool.
Definition: pcb_actions.h:108
static TOOL_ACTION duplicate
Activation of the duplication tool.
Definition: pcb_actions.h:111
int Flip(const TOOL_EVENT &aEvent)
Function Flip()
Definition: edit_tool.cpp:645
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
Definition: pcb_actions.h:114
static TOOL_ACTION rotateCw
Rotation of selected objects clockwise.
Definition: pcb_actions.h:90
static TOOL_ACTION createArray
Tool for creating an array of objects.
Definition: pcb_actions.h:287
static TOOL_ACTION exchangeFootprints
Exchange footprints of modules.
Definition: pcb_actions.h:117
static TOOL_ACTION rotateCcw
Rotation of selected objects counter-clockwise.
Definition: pcb_actions.h:93
int MoveExact(const TOOL_EVENT &aEvent)
Function MoveExact()
Definition: edit_tool.cpp:718
int Remove(const TOOL_EVENT &aEvent)
Function Remove()
Definition: edit_tool.cpp:680
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:96
int CreateArray(const TOOL_EVENT &aEvent)
Function CreateArray()
Definition: edit_tool.cpp:993
int MeasureTool(const TOOL_EVENT &aEvent)
Launches a tool to measure between points
Definition: edit_tool.cpp:1041
static TOOL_ACTION editFootprintInFpEditor
Definition: pcb_actions.h:371
int editFootprintInFpEditor(const TOOL_EVENT &aEvent)
Definition: edit_tool.cpp:1185
static TOOL_ACTION remove
Deleting a BOARD_ITEM.
Definition: pcb_actions.h:120
int Duplicate(const TOOL_EVENT &aEvent)
Function Duplicate()
Definition: edit_tool.cpp:846
static TOOL_ACTION measureTool
Definition: pcb_actions.h:352
template<class T >
T* EDIT_TOOL::uniqueHoverSelection ( bool  aSanitize = true)
inlineprivate

Function uniqueHoverSelection()

Get a single unique selection of an item, either from the current selection, or from the items under cursor via hoverSelection()

Template Parameters
Ttype of item to select
Returns
pointer to a selected item, or nullptr if none could be found.

Definition at line 197 of file edit_tool.h.

References hoverSelection().

198  {
199  if( !hoverSelection( aSanitize ) )
200  return nullptr;
201 
202  T* item = uniqueSelected<T>();
203 
204  return item;
205  }
T
enum T contains all this lexer's tokens.
bool hoverSelection(bool aSanitize=true)
Function hoverSelection()
template<class T >
T * EDIT_TOOL::uniqueSelected ( )
private

Function uniqueSelected()

Get a single selected item of a certain type

Template Parameters
Ttype of item to select
Returns
pointer to the item (of type T), or nullptr if there isn't a single selected item, or it's not of the right type.

Definition at line 1223 of file edit_tool.cpp.

References dyn_cast(), SELECTION_TOOL::GetSelection(), and m_selectionTool.

1224 {
1225  const auto selection = m_selectionTool->GetSelection();
1226 
1227  if( selection.Size() != 1 )
1228  return nullptr;
1229 
1230  auto item = selection[0];
1231  return dyn_cast<T*>( item );
1232 }
T
enum T contains all this lexer's tokens.
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:73
SELECTION & GetSelection()
Function GetSelection()
void EDIT_TOOL::updateRatsnest ( bool  aRedraw)
private

Updates ratsnest for selected items.

Parameters
aRedrawsays if selected items should be drawn using the simple mode (e.g. one line per item).

Definition at line 1154 of file edit_tool.cpp.

References SELECTION_TOOL::GetSelection(), and m_selectionTool.

Referenced by Flip(), Main(), Mirror(), and Rotate().

1155 {
1156  auto& selection = m_selectionTool->GetSelection();
1157  auto connectivity = getModel<BOARD>()->GetConnectivity();
1158  std::vector<BOARD_ITEM *> items;
1159 
1160  for ( auto item : selection )
1161  items.push_back ( static_cast<BOARD_ITEM *>( item ) );
1162 
1163  connectivity->ComputeDynamicRatsnest( items );
1164 }
SELECTION_TOOL * m_selectionTool
Selection tool used for obtaining selected items
Definition: edit_tool.h:136
SELECTION & GetSelection()
Function GetSelection()
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(), SELECTION_TOOL::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(), Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), 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(), SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectPoint(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), ZOOM_TOOL::selectRegion(), DRAWING_TOOL::SetAnchor(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

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

Member Data Documentation

std::unique_ptr<BOARD_COMMIT> EDIT_TOOL::m_commit
private

Definition at line 207 of file edit_tool.h.

Referenced by Duplicate(), Flip(), Main(), Mirror(), MoveExact(), Properties(), Remove(), Reset(), and Rotate().

VECTOR2I EDIT_TOOL::m_cursor
private

Last cursor position (needed for getModificationPoint() to avoid changes of edit reference point).

Definition at line 146 of file edit_tool.h.

Referenced by getModificationPoint(), and Main().

bool EDIT_TOOL::m_dragging
private

Flag determining if anything is being dragged right now

Definition at line 139 of file edit_tool.h.

Referenced by Flip(), Main(), Mirror(), MoveExact(), Reset(), and Rotate().

wxPoint EDIT_TOOL::m_offset
private

Offset from the dragged item's center (anchor)

Definition at line 142 of file edit_tool.h.

Referenced by Flip(), getModificationPoint(), Init(), Main(), and Rotate().

SELECTION_TOOL* EDIT_TOOL::m_selectionTool
private

Selection tool used for obtaining selected items

Definition at line 136 of file edit_tool.h.

Referenced by CreateArray(), Duplicate(), editFootprintInFpEditor(), ExchangeFootprints(), Flip(), Init(), Main(), Mirror(), MoveExact(), Properties(), Remove(), Rotate(), uniqueSelected(), and updateRatsnest().

TOOL_ID TOOL_BASE::m_toolId
protectedinherited

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

Definition at line 215 of file tool_base.h.

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

TOOL_MANAGER* TOOL_BASE::m_toolMgr
protectedinherited

Definition at line 220 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PCBNEW_CONTROL::AppendBoard(), PAD_TOOL::applyPadSettings(), TOOL_BASE::attachManager(), SELECTION_TOOL::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(), Duplicate(), editFootprintInFpEditor(), MODULE_EDITOR_TOOLS::EnumeratePads(), ExchangeFootprints(), SELECTION_TOOL::findCallback(), SELECTION_TOOL::findMove(), Flip(), TOOL_BASE::getEditFrameInt(), TOOL_BASE::GetManager(), TOOL_BASE::getModelInt(), getModificationPoint(), DRAWING_TOOL::getSourceZoneForAction(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_INTERACTIVE::goInternal(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::Init(), ALIGN_DISTRIBUTE_TOOL::Init(), PAD_TOOL::Init(), POINT_EDITOR::Init(), PCB_EDITOR_CONTROL::Init(), Init(), POSITION_RELATIVE_TOOL::Init(), ROUTER_TOOL::InlineDrag(), invokeInlineRouter(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), Mirror(), PCB_EDITOR_CONTROL::modifyLockSelected(), 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(), Properties(), PAD_TOOL::pushPadSettings(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), Remove(), SELECTION_TOOL::RequestSelection(), Rotate(), TOOL_INTERACTIVE::RunMainStack(), SELECTION_TOOL::SanitizeSelection(), SELECTION_TOOL::selectConnection(), SELECTION_TOOL::selectCopper(), SELECTION_TOOL::SelectItem(), SELECTION_TOOL::SelectItems(), SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectNet(), SELECTION_TOOL::selectOnSheetFromEeschema(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), SELECTION_TOOL::selectSameSheet(), TOOL_INTERACTIVE::SetContextMenu(), PCB_EDITOR_CONTROL::ShowLocalRatsnest(), SELECTION_TOOL::toggleSelection(), PCB_EDITOR_CONTROL::TrackWidthDec(), PCB_EDITOR_CONTROL::TrackWidthInc(), SELECTION_TOOL::UnselectItem(), SELECTION_TOOL::UnselectItems(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), TOOL_INTERACTIVE::Wait(), PCB_EDITOR_CONTROL::ZoneDuplicate(), PCB_EDITOR_CONTROL::ZoneFill(), PCB_EDITOR_CONTROL::ZoneMerge(), and PCB_EDITOR_CONTROL::ZoneUnfill().

std::string TOOL_BASE::m_toolName
protectedinherited

Name of the tool.

Names are expected to obey the format application.ToolName

(eg. pcbnew.InteractiveSelection).

Definition at line 219 of file tool_base.h.

Referenced by TOOL_BASE::GetName().

TOOL_SETTINGS TOOL_BASE::m_toolSettings
protectedinherited

Definition at line 221 of file tool_base.h.

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

TOOL_TYPE TOOL_BASE::m_type
protectedinherited

Stores the type of the tool.

Definition at line 212 of file tool_base.h.

Referenced by TOOL_BASE::GetType().


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