KiCad PCB EDA Suite
DRAWING_TOOL Class Reference

Class DRAWING_TOOL. More...

#include <drawing_tool.h>

Inheritance diagram for DRAWING_TOOL:
PCB_TOOL TOOL_INTERACTIVE TOOL_BASE

Public Types

enum  MODE {
  MODE::NONE, MODE::LINE, MODE::CIRCLE, MODE::ARC,
  MODE::TEXT, MODE::ANCHOR, MODE::DXF, MODE::DIMENSION,
  MODE::KEEPOUT, MODE::ZONE
}
 

The possible drawing modes of DRAWING_TOOL

More...
 
enum  RESET_REASON { RUN, MODEL_RELOAD, GAL_SWITCH }
 

Determines the reason of reset for a tool

More...
 

Public Member Functions

 DRAWING_TOOL ()
 
 ~DRAWING_TOOL ()
 
bool Init () override
 Function Init() Init() is called once upon a registration of the tool. More...
 
void Reset (RESET_REASON aReason) override
 Function Reset() Brings the tool to a known, initial state. More...
 
TOOL_MENUGetToolMenu ()
 

Get the DRAWING_TOOL top-level context menu

More...
 
MODE GetDrawingMode () const
 Function GetDrawingMode. More...
 
int DrawLine (const TOOL_EVENT &aEvent)
 Function DrawLine() Starts interactively drawing a line. More...
 
int DrawCircle (const TOOL_EVENT &aEvent)
 Function DrawCircle() Starts interactively drawing a circle. More...
 
int DrawArc (const TOOL_EVENT &aEvent)
 Function DrawArc() Starts interactively drawing an arc. More...
 
int PlaceText (const TOOL_EVENT &aEvent)
 Function PlaceText() Displays a dialog that allows to input text and its settings and then lets the user decide where to place the text in editor. More...
 
int DrawDimension (const TOOL_EVENT &aEvent)
 Function DrawDimension() Starts interactively drawing a dimension. More...
 
int DrawZone (const TOOL_EVENT &aEvent)
 Function DrawZone() Starts interactively drawing a zone. More...
 
int DrawVia (const TOOL_EVENT &aEvent)
 
int DrawZoneKeepout (const TOOL_EVENT &aEvent)
 Function DrawZoneKeepout() Starts interactively drawing a keepout area. More...
 
int DrawZoneCutout (const TOOL_EVENT &aEvent)
 Function DrawZoneCutout() Starts interactively drawing a zone cutout area of an existing zone. More...
 
int DrawSimilarZone (const TOOL_EVENT &aEvent)
 Function DrawSimilarZone() Starts interactively drawing a zone with same settings as an existing zone. More...
 
int PlaceDXF (const TOOL_EVENT &aEvent)
 Function PlaceDXF() Places a drawing imported from a DXF file in module editor. More...
 
int SetAnchor (const TOOL_EVENT &aEvent)
 Function SetAnchor() Places the footprint anchor (only in module editor). 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 Types

enum  ZONE_MODE { ZONE_MODE::ADD, ZONE_MODE::CUTOUT, ZONE_MODE::SIMILAR }
 

Private Member Functions

void showContextMenu ()
 

Shows the context menu for the drawing tool This menu consists of normal UI functions (zoom, grid, etc) And any suitable global functions for the active drawing type.

More...
 
bool drawSegment (int aShape, DRAWSEGMENT *&aGraphic, boost::optional< VECTOR2D > aStartingPoint=boost::none)
 

Starts drawing a selected shape (i.e.

More...
 
bool drawArc (DRAWSEGMENT *&aGraphic)
 

Starts drawing an arc.

More...
 
int drawZone (bool aKeepout, ZONE_MODE aMode)
 Draws a polygon, that is added as a zone or a keepout area. More...
 
bool getSourceZoneForAction (ZONE_MODE aMode, ZONE_CONTAINER *&aZone)
 Function getSourceZoneForAction() More...
 
void runPolygonEventLoop (POLYGON_GEOM_MANAGER &aPolyGeomMgr)
 Run the event loop for polygon creation, sending user input on to the given POLYGON_GEOM_MANAGER for processing into a complete polygon. More...
 
void make45DegLine (DRAWSEGMENT *aSegment, DRAWSEGMENT *aHelper) const
 Function make45DegLine() Forces a DRAWSEGMENT to be drawn at multiple of 45 degrees. More...
 
int getSegmentWidth (unsigned int aLayer) const
 

Returns the appropriate width for a segment depending on the settings.

More...
 
PCB_LAYER_ID getDrawingLayer () const
 

Selects a non-copper layer for drawing

More...
 

Private Attributes

KIGFX::VIEWm_view
 
KIGFX::VIEW_CONTROLSm_controls
 
BOARDm_board
 
PCB_BASE_EDIT_FRAMEm_frame
 
MODE m_mode
 
unsigned int m_lineWidth
 Stores the current line width for multisegment drawing. More...
 
TOOL_MENU m_menu
 Menu model displayed by the tool. More...
 

Static Private Attributes

static const unsigned int WIDTH_STEP = 100000
 

Friends

class ZONE_CREATE_HELPER
 

Detailed Description

Class DRAWING_TOOL.

Tool responsible for drawing graphical elements like lines, arcs, circles, etc.

Definition at line 49 of file drawing_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 DRAWING_TOOL::MODE
strong

The possible drawing modes of DRAWING_TOOL

Enumerator
NONE 
LINE 
CIRCLE 
ARC 
TEXT 
ANCHOR 
DXF 
DIMENSION 
KEEPOUT 
ZONE 

Definition at line 68 of file drawing_tool.h.

69  {
70  NONE,
71  LINE,
72  CIRCLE,
73  ARC,
74  TEXT,
75  ANCHOR,
76  DXF,
77  DIMENSION,
78  KEEPOUT,
79  ZONE,
80  };
Class DIMENSION.
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
enum DRAWING_TOOL::ZONE_MODE
strongprivate
Enumerator
ADD 

Add a new zone/keepout with fresh settings.

CUTOUT 

Make a cutout to an existing zone.

SIMILAR 

Add a new zone with the same settings as an existing one.

Definition at line 184 of file drawing_tool.h.

185  {
186  ADD,
187  CUTOUT,
188  SIMILAR
189  };

Constructor & Destructor Documentation

DRAWING_TOOL::DRAWING_TOOL ( )

Definition at line 145 of file drawing_tool.cpp.

145  :
146  PCB_TOOL( "pcbnew.InteractiveDrawing" ),
147  m_view( nullptr ), m_controls( nullptr ),
148  m_board( nullptr ), m_frame( nullptr ), m_mode( MODE::NONE ),
149  m_lineWidth( 1 ),
150  m_menu( *this )
151 {
152 }
BOARD * m_board
Definition: drawing_tool.h:266
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
PCB_TOOL(TOOL_ID aId, const std::string &aName)
Constructor.
Definition: pcb_tool.h:65
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
DRAWING_TOOL::~DRAWING_TOOL ( )

Definition at line 155 of file drawing_tool.cpp.

156 {
157 }

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(), drawArc(), DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), drawSegment(), drawZone(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PlaceText(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), SetAnchor(), ROUTER_TOOL::SettingsDialog(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

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

Function attachManager()

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

Definition at line 54 of file tool_base.cpp.

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

Referenced by TOOL_MANAGER::RegisterTool().

55 {
56  m_toolMgr = aManager;
57  m_toolSettings = TOOL_SETTINGS( this );
58 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:214
friend class TOOL_SETTINGS
Definition: tool_base.h:153
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(), DrawVia(), and MODULE_EDITOR_TOOLS::PlacePad().

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

Function DrawArc() Starts interactively drawing an arc.

After invoking the function it expects the user to first click on a point that is going to be used as the center of the arc. The second click determines the origin and radius, the third one - the angle.

Definition at line 278 of file drawing_tool.cpp.

References COMMIT::Add(), ARC, drawArc(), getDrawingLayer(), PCB_BASE_EDIT_FRAME::GetModel(), getSegmentWidth(), ID_MODEDIT_ARC_TOOL, ID_PCB_ARC_BUTT, PCB_TOOL::m_editModules, m_frame, m_lineWidth, m_mode, BOARD_COMMIT::Push(), EDA_DRAW_FRAME::SetNoToolSelected(), and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

279 {
281  DRAWSEGMENT* arc = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
282  BOARD_COMMIT commit( m_frame );
283 
284  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ARC );
285 
287  wxCURSOR_PENCIL, _( "Add graphic arc" ) );
289 
290  while( drawArc( arc ) )
291  {
292  if( arc )
293  {
294  commit.Add( arc );
295  commit.Push( _( "Draw an arc" ) );
296  }
297 
298  arc = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
299  }
300 
302 
303  return 0;
304 }
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.
int getSegmentWidth(unsigned int aLayer) const
Returns the appropriate width for a segment depending on the settings.
RAII class that sets an value at construction and resets it to the original value at destruction...
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
Abstract interface for BOARD_ITEMs capable of storing other items inside.
bool drawArc(DRAWSEGMENT *&aGraphic)
Starts drawing an arc.
bool DRAWING_TOOL::drawArc ( DRAWSEGMENT *&  aGraphic)
private

Starts drawing an arc.

Parameters
aGraphicis an object that is going to be used by the tool for drawing. It has to be already created. The tool deletes the object if it is not added to a BOARD.
Returns
False if the tool was cancelled before the origin was set or origin and end are the same point.

Definition at line 1095 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), KIGFX::VIEW::Add(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::AddPoint(), PCB_ACTIONS::arcPosture, BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), PCB_ACTIONS::decWidth, deleteLastPoint, KIGFX::VIEW_CONTROLS::GetCursorPosition(), getDrawingLayer(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::HasGeometryChanged(), PCB_ACTIONS::incWidth, TOOL_EVT_UTILS::IsCancelInteractive(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::IsComplete(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::IsReset(), m_controls, m_lineWidth, m_menu, TOOL_BASE::m_toolMgr, m_view, MD_CTRL, SELECTION::Remove(), KIGFX::VIEW::Remove(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::RemoveLastPoint(), TOOL_MANAGER::RunAction(), S_ARC, PCB_ACTIONS::selectionClear, KIGFX::PREVIEW::ARC_GEOM_MANAGER::SetAngleSnap(), KIGFX::VIEW_CONTROLS::SetAutoPan(), BOARD_ITEM::SetLayer(), DRAWSEGMENT::SetShape(), KIGFX::VIEW_CONTROLS::SetSnapping(), DRAWSEGMENT::SetWidth(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), KIGFX::PREVIEW::ARC_GEOM_MANAGER::ToggleClockwise(), KIGFX::VIEW::Update(), updateArcFromConstructionMgr(), TOOL_INTERACTIVE::Wait(), and WIDTH_STEP.

Referenced by DrawArc().

1096 {
1098 
1099  // Arc geometric construction manager
1101 
1102  // Arc drawing assistant overlay
1103  KIGFX::PREVIEW::ARC_ASSISTANT arcAsst( arcManager );
1104 
1105  // Add a VIEW_GROUP that serves as a preview for the new item
1106  SELECTION preview;
1107  m_view->Add( &preview );
1108  m_view->Add( &arcAsst );
1109 
1110  m_controls->ShowCursor( true );
1111  m_controls->SetSnapping( true );
1112 
1113  Activate();
1114 
1115  bool firstPoint = false;
1116 
1117  // Main loop: keep receiving events
1118  while( OPT_TOOL_EVENT evt = Wait() )
1119  {
1120  const VECTOR2I cursorPos = m_controls->GetCursorPosition();
1121 
1122  if( evt->IsClick( BUT_LEFT ) )
1123  {
1124  if( !firstPoint )
1125  {
1126  m_controls->SetAutoPan( true );
1127  m_controls->CaptureCursor( true );
1128 
1129  PCB_LAYER_ID layer = getDrawingLayer();
1130 
1131  // Init the new item attributes
1132  // (non-geometric, those are handled by the manager)
1133  aGraphic->SetShape( S_ARC );
1134  aGraphic->SetWidth( m_lineWidth );
1135  aGraphic->SetLayer( layer );
1136 
1137  preview.Add( aGraphic );
1138  firstPoint = true;
1139  }
1140 
1141  arcManager.AddPoint( cursorPos, true );
1142  }
1143  else if( evt->IsAction( &deleteLastPoint ) )
1144  {
1145  arcManager.RemoveLastPoint();
1146  }
1147  else if( evt->IsMotion() )
1148  {
1149  // set angle snap
1150  arcManager.SetAngleSnap( evt->Modifier( MD_CTRL ) );
1151 
1152  // update, but don't step the manager state
1153  arcManager.AddPoint( cursorPos, false );
1154  }
1155  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
1156  {
1157  preview.Clear();
1158  delete aGraphic;
1159  aGraphic = nullptr;
1160  break;
1161  }
1162  else if( evt->IsClick( BUT_RIGHT ) )
1163  {
1165  }
1166  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) )
1167  {
1169  aGraphic->SetWidth( m_lineWidth );
1170  m_view->Update( &preview );
1171  }
1172  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && m_lineWidth > WIDTH_STEP )
1173  {
1175  aGraphic->SetWidth( m_lineWidth );
1176  m_view->Update( &preview );
1177  }
1178  else if( evt->IsAction( &PCB_ACTIONS::arcPosture ) )
1179  {
1180  arcManager.ToggleClockwise();
1181  }
1182 
1183  if( arcManager.IsComplete() )
1184  {
1185  break;
1186  }
1187  else if( arcManager.HasGeometryChanged() )
1188  {
1189  updateArcFromConstructionMgr( arcManager, *aGraphic );
1190  m_view->Update( &preview );
1191  m_view->Update( &arcAsst );
1192  }
1193  }
1194 
1195  preview.Remove( aGraphic );
1196  m_view->Remove( &arcAsst );
1197  m_view->Remove( &preview );
1198  m_controls->SetAutoPan( false );
1199  m_controls->CaptureCursor( false );
1200 
1201  return !arcManager.IsReset();
1202 }
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.
Class ARC_GEOM_MANAGER.
void SetShape(STROKE_T aShape)
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:175
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
static TOOL_ACTION deleteLastPoint("pcbnew.InteractiveDrawing.deleteLastPoint", AS_CONTEXT, WXK_BACK, _("Delete Last Point"), _("Delete the last point added to the current item"), undo_xpm)
static const unsigned int WIDTH_STEP
Definition: drawing_tool.h:277
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
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
void RemoveLastPoint()
Undo the last point, and move the manager back to the previous step.
static void updateArcFromConstructionMgr(const KIGFX::PREVIEW::ARC_GEOM_MANAGER &aMgr, DRAWSEGMENT &aArc)
Update an arc DRAWSEGMENT from the current state of an Arc Geometry Manager.
void AddPoint(const VECTOR2I &aPt, bool aLockIn)
Add a point to the construction manager.
static TOOL_ACTION decWidth
Decrease width of currently drawn line.
Definition: pcb_actions.h:178
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
PCB_LAYER_ID
A quick note on layer IDs:
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
Arcs (with rounded ends)
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1389
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
static TOOL_ACTION arcPosture
Switch posture when drawing arc.
Definition: pcb_actions.h:181
void ToggleClockwise()
Reverse the current are direction
Class SELECTION_AREA.
Definition: arc_assistant.h:38
void Activate()
Function Activate() Runs the tool.
void SetAngleSnap(bool aSnap)
Set angle snapping (for the next point)
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void SetWidth(int aWidth)
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
int DRAWING_TOOL::DrawCircle ( const TOOL_EVENT aEvent)

Function DrawCircle() Starts interactively drawing a circle.

After invoking the function it expects the user to first click on a point that is going to be used as the center of the circle. The second click determines the circle radius.

Definition at line 249 of file drawing_tool.cpp.

References COMMIT::Add(), CIRCLE, drawSegment(), getDrawingLayer(), PCB_BASE_EDIT_FRAME::GetModel(), getSegmentWidth(), ID_MODEDIT_CIRCLE_TOOL, ID_PCB_CIRCLE_BUTT, PCB_TOOL::m_editModules, m_frame, m_lineWidth, m_mode, BOARD_COMMIT::Push(), S_CIRCLE, EDA_DRAW_FRAME::SetNoToolSelected(), and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

250 {
252  DRAWSEGMENT* circle = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
253  BOARD_COMMIT commit( m_frame );
254 
255  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::CIRCLE );
256 
258  wxCURSOR_PENCIL, _( "Add graphic circle" ) );
260 
261  while( drawSegment( S_CIRCLE, circle ) )
262  {
263  if( circle )
264  {
265  commit.Add( circle );
266  commit.Push( _( "Draw a circle" ) );
267  }
268 
269  circle = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
270  }
271 
273 
274  return 0;
275 }
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.
bool drawSegment(int aShape, DRAWSEGMENT *&aGraphic, boost::optional< VECTOR2D > aStartingPoint=boost::none)
Starts drawing a selected shape (i.e.
int getSegmentWidth(unsigned int aLayer) const
Returns the appropriate width for a segment depending on the settings.
RAII class that sets an value at construction and resets it to the original value at destruction...
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
Abstract interface for BOARD_ITEMs capable of storing other items inside.
int DRAWING_TOOL::DrawDimension ( const TOOL_EVENT aEvent)

Function DrawDimension() Starts interactively drawing a dimension.

After invoking the function it expects the user to first click on a point that is going to be used as the origin of the dimension. The second click determines the end and the third click modifies its height.

Definition at line 470 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), DIMENSION::AdjustDimensionDetails(), PNS::angle(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), Clamp_Text_PenSize(), SELECTION::Clear(), PCB_ACTIONS::decWidth, delta, DIMENSION, Dwgs_User, Edge_Cuts, DIMENSION::GetAngle(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), BOARD::GetDesignSettings(), getDrawingLayer(), DIMENSION::GetEnd(), DIMENSION::GetOrigin(), DIMENSION::GetPosition(), getSegmentWidth(), EDA_TEXT::GetTextSize(), DIMENSION::GetWidth(), ID_PCB_DIMENSION_BUTT, PCB_ACTIONS::incWidth, TOOL_EVT_UTILS::IsCancelInteractive(), m_board, m_controls, DIMENSION::m_featureLineDO, m_frame, m_lineWidth, m_menu, m_mode, BOARD_DESIGN_SETTINGS::m_PcbTextSize, BOARD_DESIGN_SETTINGS::m_PcbTextWidth, TOOL_BASE::m_toolMgr, m_view, BOARD_COMMIT::Push(), SELECTION::Remove(), KIGFX::VIEW::Remove(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), DIMENSION::SetEnd(), DIMENSION::SetHeight(), DIMENSION::SetLayer(), EDA_DRAW_FRAME::SetNoToolSelected(), DIMENSION::SetOrigin(), KIGFX::VIEW_CONTROLS::SetSnapping(), EDA_TEXT::SetTextSize(), EDA_TEXT::SetThickness(), PCB_BASE_FRAME::SetToolID(), DIMENSION::SetWidth(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), DIMENSION::Text(), KIGFX::VIEW::Update(), TOOL_INTERACTIVE::Wait(), WIDTH_STEP, wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by setTransitions().

471 {
472  DIMENSION* dimension = NULL;
473  BOARD_COMMIT commit( m_frame );
474  int maxThickness;
475 
476  // Add a VIEW_GROUP that serves as a preview for the new item
477  SELECTION preview;
478 
479  m_view->Add( &preview );
480 
482  m_controls->ShowCursor( true );
483  m_controls->SetSnapping( true );
484 
485  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DIMENSION );
486 
487  Activate();
488  m_frame->SetToolID( ID_PCB_DIMENSION_BUTT, wxCURSOR_PENCIL, _( "Add dimension" ) );
490 
491  enum DIMENSION_STEPS
492  {
493  SET_ORIGIN = 0,
494  SET_END,
495  SET_HEIGHT,
496  FINISHED
497  };
498  int step = SET_ORIGIN;
499 
500  // Main loop: keep receiving events
501  while( OPT_TOOL_EVENT evt = Wait() )
502  {
503  VECTOR2I cursorPos = m_controls->GetCursorPosition();
504 
506  {
507  if( step != SET_ORIGIN ) // start from the beginning
508  {
509  preview.Clear();
510 
511  delete dimension;
512  step = SET_ORIGIN;
513  }
514  else
515  break;
516 
517  if( evt->IsActivate() ) // now finish unconditionally
518  break;
519  }
520  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) && step != SET_ORIGIN )
521  {
523  dimension->SetWidth( m_lineWidth );
524  m_view->Update( &preview );
525  }
526  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && step != SET_ORIGIN )
527  {
528  if( m_lineWidth > WIDTH_STEP )
529  {
531  dimension->SetWidth( m_lineWidth );
532  m_view->Update( &preview );
533  }
534  }
535  else if( evt->IsClick( BUT_RIGHT ) )
536  {
538  }
539  else if( evt->IsClick( BUT_LEFT ) )
540  {
541  switch( step )
542  {
543  case SET_ORIGIN:
544  {
545  PCB_LAYER_ID layer = getDrawingLayer();
546 
547  if( layer == Edge_Cuts ) // dimensions are not allowed on EdgeCuts
548  layer = Dwgs_User;
549 
550  // Init the new item attributes
551  dimension = new DIMENSION( m_board );
552  dimension->SetLayer( layer );
553  dimension->SetOrigin( wxPoint( cursorPos.x, cursorPos.y ) );
554  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
556 
558  maxThickness = Clamp_Text_PenSize( width, dimension->Text().GetTextSize() );
559 
560  if( width > maxThickness )
561  width = maxThickness;
562 
563  dimension->Text().SetThickness( width );
564  dimension->SetWidth( width );
565  dimension->AdjustDimensionDetails();
566 
567  preview.Add( dimension );
568 
569  m_controls->SetAutoPan( true );
570  m_controls->CaptureCursor( true );
571  }
572  break;
573 
574  case SET_END:
575  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
576 
577  // Dimensions that have origin and end in the same spot are not valid
578  if( dimension->GetOrigin() == dimension->GetEnd() )
579  --step;
580 
581  break;
582 
583  case SET_HEIGHT:
584  {
585  if( wxPoint( cursorPos.x, cursorPos.y ) != dimension->GetPosition() )
586  {
587  assert( dimension->GetOrigin() != dimension->GetEnd() );
588  assert( dimension->GetWidth() > 0 );
589 
590  preview.Remove( dimension );
591 
592  commit.Add( dimension );
593  commit.Push( _( "Draw a dimension" ) );
594  }
595  }
596  break;
597  }
598 
599  if( ++step == FINISHED )
600  {
601  step = SET_ORIGIN;
602  m_controls->SetAutoPan( false );
603  m_controls->CaptureCursor( false );
604  }
605  }
606  else if( evt->IsMotion() )
607  {
608  switch( step )
609  {
610  case SET_END:
611  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
612  break;
613 
614  case SET_HEIGHT:
615  {
616  // Calculating the direction of travel perpendicular to the selected axis
617  double angle = dimension->GetAngle() + ( M_PI / 2 );
618 
619  wxPoint pos( cursorPos.x, cursorPos.y );
620  wxPoint delta( pos - dimension->m_featureLineDO );
621  double height = ( delta.x * cos( angle ) ) + ( delta.y * sin( angle ) );
622  dimension->SetHeight( height );
623  }
624  break;
625  }
626 
627  // Show a preview of the item
628  m_view->Update( &preview );
629  }
630  }
631 
632  if( step != SET_ORIGIN )
633  delete dimension;
634 
635  m_view->Remove( &preview );
637 
638  return 0;
639 }
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.
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
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.
BOARD * m_board
Definition: drawing_tool.h:266
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:175
int m_PcbTextWidth
current Pcb (not module) Text width
int GetWidth() const
static const unsigned int WIDTH_STEP
Definition: drawing_tool.h:277
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
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
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:214
double GetAngle() const
Function GetAngle Returns angle of the crossbar.
static const int delta[8][2]
Definition: solve.cpp:112
void SetLayer(PCB_LAYER_ID aLayer) override
Function SetLayer sets the layer this item is on.
static TOOL_ACTION decWidth
Decrease width of currently drawn line.
Definition: pcb_actions.h:178
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
int getSegmentWidth(unsigned int aLayer) const
Returns the appropriate width for a segment depending on the settings.
PCB_LAYER_ID
A quick note on layer IDs:
void SetOrigin(const wxPoint &aOrigin)
Function SetOrigin Sets a new origin of the crossbar line.
RAII class that sets an value at construction and resets it to the original value at destruction...
const wxPoint & GetEnd()
Function GetEnd.
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
wxSize m_PcbTextSize
current Pcb (not module) Text size
const wxPoint & GetOrigin() const
Function GetOrigin.
void SetEnd(const wxPoint &aEnd)
Function SetEnd Sets a new end of the crossbar line.
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
int Clamp_Text_PenSize(int aPenSize, int aSize, bool aBold)
Function Clamp_Text_PenSize As a rule, pen width should not be >1/4em, otherwise the character will b...
Definition: drawtxt.cpp:67
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1389
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
void AdjustDimensionDetails(bool aDoNotChangeText=false)
Function AdjustDimensionDetails Calculate coordinates of segments used to draw the dimension...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
void SetHeight(int aHeight)
Function SetHeight Sets the length of feature lines.
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
TEXTE_PCB & Text()
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
const wxSize & GetTextSize() const
Definition: eda_text.h:215
const wxPoint & GetPosition() const override
void SetWidth(int aWidth)
wxPoint m_featureLineDO
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
Class DIMENSION.
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:148
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
int DRAWING_TOOL::DrawLine ( const TOOL_EVENT aEvent)

Function DrawLine() Starts interactively drawing a line.

After invoking the function it expects the user to click at least two times to determine the origin and the end for a line. If there are more clicks, the line is drawn as a continous polyline.

Definition at line 213 of file drawing_tool.cpp.

References COMMIT::Add(), drawSegment(), getDrawingLayer(), DRAWSEGMENT::GetEnd(), PCB_BASE_EDIT_FRAME::GetModel(), getSegmentWidth(), ID_MODEDIT_LINE_TOOL, ID_PCB_ADD_LINE_BUTT, LINE, PCB_TOOL::m_editModules, m_frame, m_lineWidth, m_mode, BOARD_COMMIT::Push(), S_SEGMENT, EDA_DRAW_FRAME::SetNoToolSelected(), and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

214 {
216  DRAWSEGMENT* line = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
217 
218  boost::optional<VECTOR2D> startingPoint;
219  BOARD_COMMIT commit( m_frame );
220 
221  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::LINE );
222 
224  wxCURSOR_PENCIL, _( "Add graphic line" ) );
226 
227  while( drawSegment( S_SEGMENT, line, startingPoint ) )
228  {
229  if( line )
230  {
231  commit.Add( line );
232  commit.Push( _( "Draw a line segment" ) );
233  startingPoint = line->GetEnd();
234  }
235  else
236  {
237  startingPoint = boost::none;
238  }
239 
240  line = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
241  }
242 
244 
245  return 0;
246 }
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.
usual segment : line with rounded ends
bool drawSegment(int aShape, DRAWSEGMENT *&aGraphic, boost::optional< VECTOR2D > aStartingPoint=boost::none)
Starts drawing a selected shape (i.e.
int getSegmentWidth(unsigned int aLayer) const
Returns the appropriate width for a segment depending on the settings.
RAII class that sets an value at construction and resets it to the original value at destruction...
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
Abstract interface for BOARD_ITEMs capable of storing other items inside.
bool DRAWING_TOOL::drawSegment ( int  aShape,
DRAWSEGMENT *&  aGraphic,
boost::optional< VECTOR2D aStartingPoint = boost::none 
)
private

Starts drawing a selected shape (i.e.

DRAWSEGMENT).

Parameters
aShapeis the type of created shape (
See also
STROKE_T).
Parameters
aGraphicis an object that is going to be used by the tool for drawing. It has to be already created. The tool deletes the object if it is not added to a BOARD.
aStartingPointis a starting point for this new DRAWSEGMENT. If exists the new item has its start point set to aStartingPoint, and its settings (width, layer) set to the current default values.
Returns
False if the tool was cancelled before the origin was set or origin and end are the same point.

Definition at line 908 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), PCB_ACTIONS::decWidth, PCB_TOOL::frame(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), getDrawingLayer(), DRAWSEGMENT::GetEnd(), PCB_BASE_EDIT_FRAME::GetModel(), DRAWSEGMENT::GetStart(), PCB_ACTIONS::incWidth, TOOL_EVT_UTILS::IsCancelInteractive(), PCB_ACTIONS::layerChanged, m_controls, PCB_TOOL::m_editModules, m_frame, m_lineWidth, m_menu, TOOL_BASE::m_toolMgr, PCB_GENERAL_SETTINGS::m_use45DegreeGraphicSegments, m_view, make45DegLine(), MD_CTRL, BOARD_COMMIT::Push(), SELECTION::Remove(), KIGFX::VIEW::Remove(), TOOL_MANAGER::RunAction(), S_CIRCLE, S_SEGMENT, PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), DRAWSEGMENT::SetEnd(), BOARD_ITEM::SetLayer(), DRAWSEGMENT::SetShape(), KIGFX::VIEW_CONTROLS::SetSnapping(), DRAWSEGMENT::SetStart(), PCB_BASE_FRAME::Settings(), DRAWSEGMENT::SetWidth(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), KIGFX::VIEW::Update(), TOOL_INTERACTIVE::Wait(), WIDTH_STEP, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by DrawCircle(), and DrawLine().

910 {
911  // Only two shapes are currently supported
912  assert( aShape == S_SEGMENT || aShape == S_CIRCLE );
913 
914  DRAWSEGMENT line45;
915 
916  // Add a VIEW_GROUP that serves as a preview for the new item
917  SELECTION preview;
918  m_view->Add( &preview );
919 
921  m_controls->ShowCursor( true );
922  m_controls->SetSnapping( true );
923 
924  Activate();
925 
926  bool direction45 = false; // 45 degrees only mode
927  bool started = false;
928  VECTOR2I cursorPos = m_controls->GetCursorPosition();
929 
930  if( aStartingPoint )
931  {
932  // Init the new item attributes
933  aGraphic->SetShape( (STROKE_T) aShape );
934  aGraphic->SetWidth( m_lineWidth );
935  aGraphic->SetStart( wxPoint( aStartingPoint->x, aStartingPoint->y ) );
936  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
937  aGraphic->SetLayer( getDrawingLayer() );
938 
939  if( aShape == S_SEGMENT )
940  line45 = *aGraphic; // used only for direction 45 mode with lines
941 
942  preview.Add( aGraphic );
943  m_controls->SetAutoPan( true );
944  m_controls->CaptureCursor( true );
945 
946  started = true;
947  }
948 
949  // Main loop: keep receiving events
950  while( OPT_TOOL_EVENT evt = Wait() )
951  {
952  cursorPos = m_controls->GetCursorPosition();
953 
954  // 45 degree angle constraint enabled with an option and toggled with Ctrl
955  const bool limit45 = ( frame()->Settings().m_use45DegreeGraphicSegments != !!( evt->Modifier( MD_CTRL ) ) );
956 
957  if( direction45 != limit45 && started && aShape == S_SEGMENT )
958  {
959  direction45 = limit45;
960 
961  if( direction45 )
962  {
963  preview.Add( &line45 );
964  make45DegLine( aGraphic, &line45 );
965  }
966  else
967  {
968  preview.Remove( &line45 );
969  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
970  }
971 
972  m_view->Update( &preview );
973  }
974 
976  {
977  preview.Clear();
978  m_view->Update( &preview );
979  delete aGraphic;
980  aGraphic = NULL;
981  break;
982  }
983  else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) )
984  {
985  aGraphic->SetLayer( getDrawingLayer() );
986  m_view->Update( &preview );
987  }
988  else if( evt->IsClick( BUT_RIGHT ) )
989  {
991  }
992  else if( evt->IsClick( BUT_LEFT ) || evt->IsDblClick( BUT_LEFT ) )
993  {
994  if( !started )
995  {
996  // Init the new item attributes
997  aGraphic->SetShape( (STROKE_T) aShape );
998  aGraphic->SetWidth( m_lineWidth );
999  aGraphic->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
1000  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1001  aGraphic->SetLayer( getDrawingLayer() );
1002 
1003  if( aShape == S_SEGMENT )
1004  line45 = *aGraphic; // used only for direction 45 mode with lines
1005 
1006  preview.Add( aGraphic );
1007  m_controls->SetAutoPan( true );
1008  m_controls->CaptureCursor( true );
1009 
1010  started = true;
1011  }
1012  else
1013  {
1014  if( aGraphic->GetEnd() == aGraphic->GetStart()
1015  || ( evt->IsDblClick( BUT_LEFT ) && aShape == S_SEGMENT ) )
1016  // User has clicked twice in the same spot
1017  {
1018  // a clear sign that the current drawing is finished
1019  // Now we have to add the helper line as well
1020  if( direction45 )
1021  {
1022  BOARD_ITEM_CONTAINER* parent = m_frame->GetModel();
1023  DRAWSEGMENT* l = m_editModules ? new EDGE_MODULE( (MODULE*) parent )
1024  : new DRAWSEGMENT;
1025 
1026  // Copy coordinates, layer, etc.
1027  *static_cast<DRAWSEGMENT*>( l ) = line45;
1028  l->SetEnd( aGraphic->GetStart() );
1029 
1030  BOARD_COMMIT commit( m_frame );
1031  commit.Add( l );
1032  commit.Push( _( "Draw a line" ) );
1033  }
1034 
1035  delete aGraphic;
1036  aGraphic = NULL;
1037  }
1038 
1039  preview.Clear();
1040  break;
1041  }
1042  }
1043  else if( evt->IsMotion() )
1044  {
1045  // 45 degree lines
1046  if( direction45 && aShape == S_SEGMENT )
1047  make45DegLine( aGraphic, &line45 );
1048  else
1049  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1050 
1051  m_view->Update( &preview );
1052  }
1053  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) )
1054  {
1056  aGraphic->SetWidth( m_lineWidth );
1057  line45.SetWidth( m_lineWidth );
1058  m_view->Update( &preview );
1059  }
1060  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && ( m_lineWidth > WIDTH_STEP ) )
1061  {
1063  aGraphic->SetWidth( m_lineWidth );
1064  line45.SetWidth( m_lineWidth );
1065  m_view->Update( &preview );
1066  }
1067  }
1068 
1069  m_view->Remove( &preview );
1070  m_controls->SetAutoPan( false );
1071  m_controls->CaptureCursor( false );
1072 
1073  return started;
1074 }
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.
void SetShape(STROKE_T aShape)
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:175
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
static const unsigned int WIDTH_STEP
Definition: drawing_tool.h:277
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
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
usual segment : line with rounded ends
static TOOL_ACTION decWidth
Decrease width of currently drawn line.
Definition: pcb_actions.h:178
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
PCB_GENERAL_SETTINGS & Settings()
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:125
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:271
STROKE_T
Enum STROKE_T is the set of shapes for segments (graphic segments and tracks) which are often in the ...
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1389
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
void SetStart(const wxPoint &aStart)
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:267
void SetEnd(const wxPoint &aEnd)
void Activate()
Function Activate() Runs the tool.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
Abstract interface for BOARD_ITEMs capable of storing other items inside.
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void make45DegLine(DRAWSEGMENT *aSegment, DRAWSEGMENT *aHelper) const
Function make45DegLine() Forces a DRAWSEGMENT to be drawn at multiple of 45 degrees.
void SetWidth(int aWidth)
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
int DRAWING_TOOL::DrawSimilarZone ( const TOOL_EVENT aEvent)

Function DrawSimilarZone() Starts interactively drawing a zone with same settings as an existing zone.

The normal zone interactive tool is used, but the zone settings dialog is not shown at the start.

Definition at line 672 of file drawing_tool.cpp.

References drawZone(), ID_PCB_ZONES_BUTT, m_frame, m_mode, PCB_BASE_FRAME::SetToolID(), SIMILAR, and ZONE.

Referenced by setTransitions().

673 {
674  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
675 
676  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add similar zone" ) );
677 
678  return drawZone( false, ZONE_MODE::SIMILAR );
679 }
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.
int drawZone(bool aKeepout, ZONE_MODE aMode)
Draws a polygon, that is added as a zone or a keepout area.
Add a new zone with the same settings as an existing one.
RAII class that sets an value at construction and resets it to the original value at destruction...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
int DRAWING_TOOL::DrawVia ( const TOOL_EVENT aEvent)

Definition at line 1382 of file drawing_tool.cpp.

References B_Cu, PCB_TOOL::doInteractiveItemPlacement(), F_Cu, PCB_TOOL::frame(), PCB_BASE_FRAME::GetActiveLayer(), BOARD::GetCopperLayerCount(), BOARD::GetDesignSettings(), BOARD_ITEM::GetLayer(), VIA::GetLayerSet(), NETINFO_ITEM::GetMicroViaDrillSize(), NETINFO_ITEM::GetMicroViaSize(), BOARD_CONNECTED_ITEM::GetNet(), VIA::GetPosition(), PCB_BASE_FRAME::GetScreen(), VIA::GetViaType(), ID_NO_TOOL_SELECTED, ID_PCB_DRAW_VIA_BUTT, In1_Cu, PCB_TOOL::IPO_FLIP, PCB_TOOL::IPO_PROPERTIES, PCB_TOOL::IPO_REPEAT, PCB_TOOL::IPO_ROTATE, PCB_TOOL::IPO_SINGLE_CLICK, BOARD::IsLayerVisible(), m_board, m_frame, PCB_SCREEN::m_Route_Layer_BOTTOM, PCB_SCREEN::m_Route_Layer_TOP, mod, BOARD::Modules(), VIA::SetDrill(), VIA::SetLayerPair(), BOARD_CONNECTED_ITEM::SetNetCode(), PCB_BASE_FRAME::SetToolID(), VIA::SetViaType(), TRACK::SetWidth(), ToLAYER_ID(), BOARD::Tracks(), VIA, VIA_BLIND_BURIED, VIA_MICROVIA, and BOARD::Zones().

Referenced by setTransitions().

1383 {
1384  struct VIA_PLACER : public INTERACTIVE_PLACER_BASE
1385  {
1386  int findStitchedZoneNet( VIA* aVia )
1387  {
1388  const auto pos = aVia->GetPosition();
1389  const auto lset = aVia->GetLayerSet();
1390 
1391  for( auto tv : m_board->Tracks() ) // fixme: move to BOARD class?
1392  {
1393  if( tv->HitTest( pos ) && ( tv->GetLayerSet() & lset ).any() )
1394  return -1;
1395  }
1396 
1397  for( auto mod : m_board->Modules() )
1398  {
1399  for( auto pad : mod->Pads() )
1400  {
1401  if( pad->HitTest( pos ) && ( pad->GetLayerSet() & lset ).any() )
1402  return -1;
1403  }
1404  }
1405 
1406  std::vector<ZONE_CONTAINER*> foundZones;
1407 
1408  for( auto zone : m_board->Zones() )
1409  {
1410  if( zone->HitTestFilledArea( pos ) )
1411  {
1412  foundZones.push_back( zone );
1413  }
1414  }
1415 
1416  std::sort( foundZones.begin(), foundZones.end(),
1417  [] ( const ZONE_CONTAINER* a, const ZONE_CONTAINER* b ) {
1418  return a->GetLayer() < b->GetLayer();
1419  } );
1420 
1421  // first take the net of the active layer
1422  for( auto z : foundZones )
1423  {
1424  if( m_frame->GetActiveLayer() == z->GetLayer() )
1425  return z->GetNetCode();
1426  }
1427 
1428  // none? take the topmost visible layer
1429  for( auto z : foundZones )
1430  {
1431  if( m_board->IsLayerVisible( z->GetLayer() ) )
1432  return z->GetNetCode();
1433  }
1434 
1435  return -1;
1436  }
1437 
1438  bool PlaceItem( BOARD_ITEM* aItem ) override
1439  {
1440  auto via = static_cast<VIA*>( aItem );
1441  int newNet = findStitchedZoneNet( via );
1442 
1443  if( newNet > 0 )
1444  via->SetNetCode( newNet );
1445 
1446  return false;
1447  }
1448 
1449  std::unique_ptr<BOARD_ITEM> CreateItem() override
1450  {
1451  auto& ds = m_board->GetDesignSettings();
1452  VIA* via = new VIA( m_board );
1453 
1454  via->SetNetCode( 0 );
1455  via->SetViaType( ds.m_CurrentViaType );
1456 
1457  // for microvias, the size and hole will be changed later.
1458  via->SetWidth( ds.GetCurrentViaSize() );
1459  via->SetDrill( ds.GetCurrentViaDrill() );
1460 
1461  // Usual via is from copper to component.
1462  // layer pair is B_Cu and F_Cu.
1463  via->SetLayerPair( B_Cu, F_Cu );
1464 
1465  PCB_LAYER_ID first_layer = m_frame->GetActiveLayer();
1466  PCB_LAYER_ID last_layer;
1467 
1468  // prepare switch to new active layer:
1469  if( first_layer != m_frame->GetScreen()->m_Route_Layer_TOP )
1470  last_layer = m_frame->GetScreen()->m_Route_Layer_TOP;
1471  else
1472  last_layer = m_frame->GetScreen()->m_Route_Layer_BOTTOM;
1473 
1474  // Adjust the actual via layer pair
1475  switch( via->GetViaType() )
1476  {
1477  case VIA_BLIND_BURIED:
1478  via->SetLayerPair( first_layer, last_layer );
1479  break;
1480 
1481  case VIA_MICROVIA: // from external to the near neighbor inner layer
1482  {
1483  PCB_LAYER_ID last_inner_layer =
1484  ToLAYER_ID( ( m_board->GetCopperLayerCount() - 2 ) );
1485 
1486  if( first_layer == B_Cu )
1487  last_layer = last_inner_layer;
1488  else if( first_layer == F_Cu )
1489  last_layer = In1_Cu;
1490  else if( first_layer == last_inner_layer )
1491  last_layer = B_Cu;
1492  else if( first_layer == In1_Cu )
1493  last_layer = F_Cu;
1494 
1495  // else error: will be removed later
1496  via->SetLayerPair( first_layer, last_layer );
1497 
1498  // Update diameter and hole size, which where set previously
1499  // for normal vias
1500  NETINFO_ITEM* net = via->GetNet();
1501 
1502  if( net )
1503  {
1504  via->SetWidth( net->GetMicroViaSize() );
1505  via->SetDrill( net->GetMicroViaDrillSize() );
1506  }
1507  }
1508  break;
1509 
1510  default:
1511  break;
1512  }
1513 
1514  return std::unique_ptr<BOARD_ITEM>( via );
1515  }
1516  };
1517 
1518  VIA_PLACER placer;
1519 
1520  frame()->SetToolID( ID_PCB_DRAW_VIA_BUTT, wxCURSOR_PENCIL, _( "Add vias" ) );
1521 
1522  doInteractiveItemPlacement( &placer, _( "Place via" ),
1524 
1525  frame()->SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString );
1526 
1527  return 0;
1528 }
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:78
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.
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
BOARD * m_board
Definition: drawing_tool.h:266
void SetViaType(VIATYPE_T aViaType)
Definition: class_track.h:440
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
int GetCopperLayerCount() const
Function GetCopperLayerCount.
void SetWidth(int aWidth)
Definition: class_track.h:114
PCB_LAYER_ID
A quick note on layer IDs:
DLIST_ITERATOR_WRAPPER< MODULE > Modules()
Definition: class_board.h:250
VIATYPE_T GetViaType() const
Definition: class_track.h:439
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:125
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
PCB_LAYER_ID m_Route_Layer_BOTTOM
bool SetNetCode(int aNetCode, bool aNoAssert=false)
Function SetNetCode sets net using a net code.
void SetLayerPair(PCB_LAYER_ID aTopLayer, PCB_LAYER_ID aBottomLayer)
Function SetLayerPair For a via m_Layer contains the top layer, the other layer is in m_BottomLayer...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
Class NETINFO_ITEM handles the data for a net.
Definition: class_netinfo.h:69
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
ZONE_CONTAINERS & Zones()
Definition: class_board.h:252
void SetDrill(int aDrill)
Function SetDrill sets the drill value for vias.
Definition: class_track.h:447
PCB_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
const wxPoint & GetPosition() const override
Definition: class_track.h:411
int GetMicroViaDrillSize()
Function GetViaDrillSize returns the size of via drills used to route this net.
DLIST_ITERATOR_WRAPPER< TRACK > Tracks()
Definition: class_board.h:249
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...
Definition: pcb_tool.cpp:38
int GetMicroViaSize()
Function GetMicroViaSize returns the size of vias used to route this net.
virtual PCB_LAYER_ID GetActiveLayer() const
Function GetActiveLayer returns the active layer.
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:767
#define mod(a, n)
Definition: greymap.cpp:24
NETINFO_ITEM * GetNet() const
Function GetNet Returns NET_INFO object for a given item.
PCB_LAYER_ID m_Route_Layer_TOP
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
Function IsLayerVisible is a proxy function that calls the correspondent function in m_BoardSettings ...
Definition: class_board.h:451
int DRAWING_TOOL::DrawZone ( const TOOL_EVENT aEvent)

Function DrawZone() Starts interactively drawing a zone.

After invoking the function a zone settings dialog is displayed. After confirmation it allows the user to set points that are going to be used as a boundary polygon of the zone. Double click or clicking on the origin of the boundary polyline finishes the drawing.

Definition at line 642 of file drawing_tool.cpp.

References ADD, drawZone(), ID_PCB_ZONES_BUTT, m_frame, m_mode, PCB_BASE_FRAME::SetToolID(), and ZONE.

Referenced by setTransitions().

643 {
644  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
645 
646  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add zones" ) );
647 
648  return drawZone( false, ZONE_MODE::ADD );
649 }
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.
int drawZone(bool aKeepout, ZONE_MODE aMode)
Draws a polygon, that is added as a zone or a keepout area.
RAII class that sets an value at construction and resets it to the original value at destruction...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
Add a new zone/keepout with fresh settings.
int DRAWING_TOOL::drawZone ( bool  aKeepout,
ZONE_MODE  aMode 
)
private

Draws a polygon, that is added as a zone or a keepout area.

Parameters
aKeepoutdictates if the drawn polygon is a zone or a keepout area.
aModedictates the mode of the zone tool: ADD add a new zone/keepout with fresh settings CUTOUT add a cutout to an existing zone SIMILAR add a new zone with the same settings as an existing one

Definition at line 1321 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), PCB_TOOL::controls(), getSourceZoneForAction(), TOOL_BASE::getViewControls(), m_frame, ZONE_CREATE_HELPER::PARAMS::m_keepout, ZONE_CREATE_HELPER::PARAMS::m_mode, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, TOOL_BASE::m_toolMgr, TOOL_MANAGER::RunAction(), runPolygonEventLoop(), PCB_ACTIONS::selectionClear, EDA_DRAW_FRAME::SetNoToolSelected(), KIGFX::VIEW_CONTROLS::SetSnapping(), and KIGFX::VIEW_CONTROLS::ShowCursor().

Referenced by DrawSimilarZone(), DrawZone(), DrawZoneCutout(), and DrawZoneKeepout().

1322 {
1323  // get a source zone, if we need one. We need it for:
1324  // ZONE_MODE::CUTOUT (adding a hole to the source zone)
1325  // ZONE_MODE::SIMILAR (creating a new zone using settings of source zone
1326  ZONE_CONTAINER* sourceZone = nullptr;
1327 
1328  if( !getSourceZoneForAction( aMode, sourceZone ) )
1329  return 0;
1330 
1332 
1333  params.m_keepout = aKeepout;
1334  params.m_mode = aMode;
1335  params.m_sourceZone = sourceZone;
1336 
1337  ZONE_CREATE_HELPER zoneTool( *this, params );
1338 
1339  // the geometry manager which handles the zone geometry, and
1340  // hands the calculated points over to the zone creator tool
1341  POLYGON_GEOM_MANAGER polyGeomMgr( zoneTool );
1342 
1343  Activate(); // register for events
1344 
1345  auto& controls = *getViewControls();
1346 
1348 
1349  controls.ShowCursor( true );
1350  controls.SetSnapping( true );
1351 
1352  runPolygonEventLoop( polyGeomMgr );
1353 
1355 
1356  return 0;
1357 }
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.
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:78
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
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
bool getSourceZoneForAction(ZONE_MODE aMode, ZONE_CONTAINER *&aZone)
Function getSourceZoneForAction()
Parameters used to fully describe a zone creation process.
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:124
ZONE_CONTAINER * m_sourceZone
Zone settings source (for similar and cutout zones)
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
DRAWING_TOOL::ZONE_MODE m_mode
The zone mode to operate in
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
This class is an adjuct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry ...
void Activate()
Function Activate() Runs the tool.
bool m_keepout
Should create a keepout zone?
void runPolygonEventLoop(POLYGON_GEOM_MANAGER &aPolyGeomMgr)
Run the event loop for polygon creation, sending user input on to the given POLYGON_GEOM_MANAGER for ...
Class that handles the drawing of a polygon, including management of last corner deletion and drawing...
int DRAWING_TOOL::DrawZoneCutout ( const TOOL_EVENT aEvent)

Function DrawZoneCutout() Starts interactively drawing a zone cutout area of an existing zone.

The normal zone interactive tool is used, but the zone settings dialog is not shown (since the cutout affects only shape of an existing zone).

Definition at line 662 of file drawing_tool.cpp.

References CUTOUT, drawZone(), ID_PCB_ZONES_BUTT, m_frame, m_mode, PCB_BASE_FRAME::SetToolID(), and ZONE.

Referenced by setTransitions().

663 {
664  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
665 
666  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add zone cutout" ) );
667 
668  return drawZone( false, ZONE_MODE::CUTOUT );
669 }
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.
int drawZone(bool aKeepout, ZONE_MODE aMode)
Draws a polygon, that is added as a zone or a keepout area.
RAII class that sets an value at construction and resets it to the original value at destruction...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
Make a cutout to an existing zone.
int DRAWING_TOOL::DrawZoneKeepout ( const TOOL_EVENT aEvent)

Function DrawZoneKeepout() Starts interactively drawing a keepout area.

After invoking the function an area settings dialog is displayed. After confirmation it allows the user to set points that are going to be used as a boundary polygon of the area. Double click or clicking on the origin of the boundary polyline finishes the drawing.

Definition at line 652 of file drawing_tool.cpp.

References ADD, drawZone(), ID_PCB_KEEPOUT_AREA_BUTT, KEEPOUT, m_frame, m_mode, and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

653 {
654  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::KEEPOUT );
655 
656  m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add keepout" ) );
657 
658  return drawZone( true, ZONE_MODE::ADD );
659 }
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.
int drawZone(bool aKeepout, ZONE_MODE aMode)
Draws a polygon, that is added as a zone or a keepout area.
RAII class that sets an value at construction and resets it to the original value at destruction...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
Add a new zone/keepout with fresh settings.
bool PCB_TOOL::EditingModules ( ) const
inlineinherited

Definition at line 91 of file pcb_tool.h.

References PCB_TOOL::m_editModules.

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

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

functions below are not yet implemented - their interface may change

const TOOL_EVENT TOOL_INTERACTIVE::evButtonDown ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evButtonUp ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evClick ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evCommand ( int  aCommandId = -1)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evCommand ( std::string  aCommandStr = "")
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evDrag ( int  aButton = BUT_ANY)
protectedinherited
const TOOL_EVENT TOOL_INTERACTIVE::evMotion ( )
protectedinherited
PCB_EDIT_FRAME* PCB_TOOL::frame ( ) const
inlineprotectedinherited

Definition at line 125 of file pcb_tool.h.

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

125 { return getEditFrame<PCB_EDIT_FRAME>(); }
PCB_LAYER_ID DRAWING_TOOL::getDrawingLayer ( ) const
private

Selects a non-copper layer for drawing

Definition at line 1561 of file drawing_tool.cpp.

References B_Cu, B_SilkS, Dwgs_User, F_Cu, F_SilkS, PCB_BASE_FRAME::GetActiveLayer(), IsCopperLayer(), m_frame, and PCB_BASE_FRAME::SetActiveLayer().

Referenced by DrawArc(), drawArc(), DrawCircle(), DrawDimension(), DrawLine(), and drawSegment().

1562 {
1563  PCB_LAYER_ID layer = m_frame->GetActiveLayer();
1564 
1565  if( IsCopperLayer( layer ) )
1566  {
1567  if( layer == F_Cu )
1568  layer = F_SilkS;
1569  else if( layer == B_Cu )
1570  layer = B_SilkS;
1571  else
1572  layer = Dwgs_User;
1573 
1574  m_frame->SetActiveLayer( layer );
1575  }
1576 
1577  return layer;
1578 }
PCB_LAYER_ID
A quick note on layer IDs:
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
Function SetActiveLayer will change the currently active layer to aLayer.
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool IsCopperLayer(LAYER_NUM aLayerId)
Function IsCopperLayer tests whether a layer is a copper layer.
virtual PCB_LAYER_ID GetActiveLayer() const
Function GetActiveLayer returns the active layer.
DRAWING_TOOL::MODE DRAWING_TOOL::GetDrawingMode ( ) const

Function GetDrawingMode.

Returns the current drawing mode of the DRAWING_TOOL, or MODE::NONE if not currently in any drawing mode

Definition at line 207 of file drawing_tool.cpp.

References m_mode.

Referenced by PCB_EDITOR_CONTROL::Init().

208 {
209  return m_mode;
210 }
template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Function getEditFrame()

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

Definition at line 186 of file tool_base.h.

References TOOL_BASE::getEditFrameInt().

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

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

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

The identifier is set by an instance of TOOL_MANAGER.

Returns
Identifier of the tool.

Definition at line 122 of file tool_base.h.

References TOOL_BASE::m_toolId.

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

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

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

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

Definition at line 144 of file tool_base.h.

References TOOL_BASE::m_toolMgr.

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

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

Function getModel()

Returns the model object if it matches the requested type.

Definition at line 197 of file tool_base.h.

References TOOL_BASE::getModelInt().

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

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

Function GetName() Returns the name of the tool.

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

Returns
The name of the tool.

Definition at line 133 of file tool_base.h.

References TOOL_BASE::m_toolName.

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

134  {
135  return m_toolName;
136  }
std::string m_toolName
Name of the tool.
Definition: tool_base.h:212
int DRAWING_TOOL::getSegmentWidth ( unsigned int  aLayer) const
private

Returns the appropriate width for a segment depending on the settings.

Definition at line 1548 of file drawing_tool.cpp.

References Edge_Cuts, BOARD::GetDesignSettings(), m_board, BOARD_DESIGN_SETTINGS::m_DrawSegmentWidth, BOARD_DESIGN_SETTINGS::m_EdgeSegmentWidth, PCB_TOOL::m_editModules, and BOARD_DESIGN_SETTINGS::m_ModuleSegmentWidth.

Referenced by DrawArc(), DrawCircle(), DrawDimension(), and DrawLine().

1549 {
1550  assert( m_board );
1551 
1552  if( aLayer == Edge_Cuts )
1554  else if( m_editModules )
1556  else
1558 }
BOARD * m_board
Definition: drawing_tool.h:266
int m_ModuleSegmentWidth
Default width for all graphic lines.
int m_DrawSegmentWidth
current graphic line width (not EDGE layer)
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
bool m_editModules
Definition: pcb_tool.h:128
int m_EdgeSegmentWidth
current graphic line width (EDGE layer only)
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:214
bool DRAWING_TOOL::getSourceZoneForAction ( ZONE_MODE  aMode,
ZONE_CONTAINER *&  aZone 
)
private

Function getSourceZoneForAction()

Gets a source zone item for an action that takes an existing zone into account (for example a cutout of an existing zone). The source zone is taken from the current selection

Parameters
aModemode of the zone tool
aZoneupdated pointer to a suitable source zone, or nullptr if none found, or the action doesn't need a source
Returns
true if a suitable zone was found, or the action doesn't need a zone. False if the action needs a zone but none was found.

Definition at line 1205 of file drawing_tool.cpp.

References ADD, dyn_cast(), SELECTION_TOOL::GetSelection(), TOOL_MANAGER::GetTool(), TOOL_BASE::m_toolMgr, TOOL_MANAGER::RunAction(), and PCB_ACTIONS::selectionCursor.

Referenced by drawZone().

1206 {
1207  aZone = nullptr;
1208 
1209  // not an action that needs a source zone
1210  if( aMode == ZONE_MODE::ADD )
1211  return true;
1212 
1214  const SELECTION& selection = selTool->GetSelection();
1215 
1216  if( selection.Empty() )
1218 
1219  // we want a single zone
1220  if( selection.Size() != 1 )
1221  return false;
1222 
1223  aZone = dyn_cast<ZONE_CONTAINER*>( selection[0] );
1224 
1225  // expected a zone, but didn't get one
1226  if( !aZone )
1227  return false;
1228 
1229  return true;
1230 }
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:78
Class SELECTION_TOOL.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:73
SELECTION & GetSelection()
Function GetSelection()
Add a new zone/keepout with fresh settings.
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
Definition: pcb_actions.h:50
TOOL_MENU& DRAWING_TOOL::GetToolMenu ( )
inline

Get the DRAWING_TOOL top-level context menu

Definition at line 62 of file drawing_tool.h.

References m_menu.

Referenced by PCB_EDITOR_CONTROL::Init().

63  {
64  return m_menu;
65  }
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
TOOL_TYPE TOOL_BASE::GetType ( ) const
inlineinherited

Function GetType() Returns the type of the tool.

Returns
The type of the tool.

Definition at line 111 of file tool_base.h.

References TOOL_BASE::m_type.

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

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

Function getView()

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

Returns
The instance of VIEW.

Definition at line 30 of file tool_base.cpp.

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

Referenced by PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), PCBNEW_CONTROL::CursorControl(), SELECTION_TOOL::disambiguationMenu(), MICROWAVE_TOOL::drawMicrowaveInductor(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), SELECTION_TOOL::findCallback(), ROUTER_TOOL::getStartLayer(), PCBNEW_CONTROL::GridSetOrigin(), SELECTION_TOOL::guessSelectionCandidates(), PCBNEW_CONTROL::HighContrastMode(), PNS::TOOL_BASE::highlightNet(), PCBNEW_CONTROL::LayerAlphaDec(), PCBNEW_CONTROL::LayerAlphaInc(), EDIT_TOOL::MeasureTool(), MODULE_EDITOR_TOOLS::ModuleEdgeOutlines(), MODULE_EDITOR_TOOLS::ModuleTextOutlines(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), PCBNEW_CONTROL::PadDisplayMode(), PCBNEW_CONTROL::PanControl(), PNS::TOOL_BASE::pickSingleItem(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PCB_EDITOR_CONTROL::Reset(), PCBNEW_CONTROL::Reset(), PNS::TOOL_BASE::Reset(), 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:213
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:243
KIGFX::VIEW_CONTROLS * TOOL_BASE::getViewControls ( ) const
protectedinherited
template<class T >
void TOOL_INTERACTIVE::Go ( int(T::*)(const TOOL_EVENT &)  aStateFunc,
const TOOL_EVENT_LIST aConditions = TOOL_EVENTTC_ANYTA_ANY ) 
)
inherited

Function Go()

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

Definition at line 135 of file tool_interactive.h.

References TOOL_INTERACTIVE::goInternal().

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

137 {
138  TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
139 
140  goInternal( sptr, aConditions );
141 }
std::function< int(const TOOL_EVENT &)> TOOL_STATE_FUNC
Definition: tool_base.h:59
void goInternal(TOOL_STATE_FUNC &aState, const TOOL_EVENT_LIST &aConditions)
bool DRAWING_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 160 of file drawing_tool.cpp.

References CONDITIONAL_MENU::AddItem(), TOOL_MENU::AddStandardSubMenus(), ARC, ACTIONS::cancelInteractive, closeZoneOutline, deleteLastPoint, TOOL_MENU::GetMenu(), m_menu, m_mode, NONE, and ZONE.

161 {
162  auto activeToolFunctor = [ this ] ( const SELECTION& aSel ) {
163  return m_mode != MODE::NONE;
164  };
165 
166  // some interactive drawing tools can undo the last point
167  auto canUndoPoint = [ this ] ( const SELECTION& aSel ) {
168  return m_mode == MODE::ARC || m_mode == MODE::ZONE;
169  };
170 
171  // functor for zone-only actions
172  auto zoneActiveFunctor = [this ] ( const SELECTION& aSel ) {
173  return m_mode == MODE::ZONE;
174  };
175 
176  auto& ctxMenu = m_menu.GetMenu();
177 
178  // cancel current toool goes in main context menu at the top if present
179  ctxMenu.AddItem( ACTIONS::cancelInteractive, activeToolFunctor, 1000 );
180 
181  // tool-specific actions
182  ctxMenu.AddItem( closeZoneOutline, zoneActiveFunctor, 1000 );
183  ctxMenu.AddItem( deleteLastPoint, canUndoPoint, 1000 );
184 
185  ctxMenu.AddSeparator( activeToolFunctor, 1000 );
186 
187  // Type-specific sub-menus will be added for us by other tools
188  // For example, zone fill/unfill is provided by the PCB control tool
189 
190  // Finally, add the standard zoom/grid items
191  m_menu.AddStandardSubMenus( *getEditFrame<PCB_BASE_FRAME>() );
192 
193  return true;
194 }
static TOOL_ACTION closeZoneOutline("pcbnew.InteractiveDrawing.closeZoneOutline", AS_CONTEXT, 0, _("Close Zone Outline"), _("Close the outline of a zone in progress"), checked_ok_xpm)
static TOOL_ACTION deleteLastPoint("pcbnew.InteractiveDrawing.deleteLastPoint", AS_CONTEXT, WXK_BACK, _("Delete Last Point"), _("Delete the last point added to the current item"), undo_xpm)
CONDITIONAL_MENU & GetMenu()
Function GetMenu.
Definition: tool_menu.cpp:49
static TOOL_ACTION cancelInteractive
Definition: actions.h:45
void AddStandardSubMenus(EDA_DRAW_FRAME &aFrame)
Function CreateBasicMenu.
Definition: tool_menu.cpp:95
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition=SELECTION_CONDITIONS::ShowAlways, int aOrder=ANY_ORDER)
Function AddItem()
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void DRAWING_TOOL::make45DegLine ( DRAWSEGMENT aSegment,
DRAWSEGMENT aHelper 
) const
private

Function make45DegLine() Forces a DRAWSEGMENT to be drawn at multiple of 45 degrees.

The origin stays the same, the end of the aSegment is modified according to the current cursor position.

Parameters
aSegmentis the segment that is currently drawn.
aHelperis a helper line that shows the next possible segment.

Definition at line 1360 of file drawing_tool.cpp.

References KIGFX::VIEW_CONTROLS::GetCursorPosition(), DRAWSEGMENT::GetStart(), m_controls, SHAPE_LINE_CHAIN::Point(), SHAPE_LINE_CHAIN::PointCount(), DRAWSEGMENT::SetEnd(), DRAWSEGMENT::SetStart(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by drawSegment().

1361 {
1362  VECTOR2I cursorPos = m_controls->GetCursorPosition();
1363  VECTOR2I origin( aSegment->GetStart() );
1364  DIRECTION_45 direction( origin - cursorPos );
1365  SHAPE_LINE_CHAIN newChain = direction.BuildInitialTrace( origin, cursorPos );
1366 
1367  if( newChain.PointCount() > 2 )
1368  {
1369  aSegment->SetEnd( wxPoint( newChain.Point( -2 ).x, newChain.Point( -2 ).y ) );
1370  aHelper->SetStart( wxPoint( newChain.Point( -2 ).x, newChain.Point( -2 ).y ) );
1371  aHelper->SetEnd( wxPoint( newChain.Point( -1 ).x, newChain.Point( -1 ).y ) );
1372  }
1373  else
1374  {
1375  aSegment->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1376  aHelper->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
1377  aHelper->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1378  }
1379 }
int PointCount() const
Function PointCount()
Class DIRECTION_45.
Definition: direction45.h:33
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
void SetStart(const wxPoint &aStart)
Class SHAPE_LINE_CHAIN.
void SetEnd(const wxPoint &aEnd)
VECTOR2I & Point(int aIndex)
Function Point()
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
int DRAWING_TOOL::PlaceDXF ( const TOOL_EVENT aEvent)

Function PlaceDXF() Places a drawing imported from a DXF file in module editor.

Definition at line 682 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), BUT_LEFT, BUT_RIGHT, SELECTION::Clear(), delta, DXF, PCB_ACTIONS::flip, KIGFX::VIEW_GROUP::FreeItems(), SELECTION::Front(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), DRAWSEGMENT::GetBezierPoints(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), DRAWSEGMENT::GetEnd(), TOOL_EVT_UTILS::GetEventRotationAngle(), EDA_TEXT::GetHorizJustify(), DIALOG_DXF_IMPORT::GetImportedItems(), GetLayer(), PCB_BASE_EDIT_FRAME::GetModel(), DRAWSEGMENT::GetPolyPoints(), BOARD_ITEM::GetPosition(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextPos(), EDA_TEXT::GetTextSize(), EDA_TEXT::GetThickness(), DRAWSEGMENT::GetType(), EDA_TEXT::GetVertJustify(), DRAWSEGMENT::GetWidth(), EDA_TEXT::IsBold(), TOOL_EVT_UTILS::IsCancelInteractive(), EDA_TEXT::IsItalic(), EDA_TEXT::IsMirrored(), EDA_TEXT::IsMultilineAllowed(), TOOL_EVT_UTILS::IsRotateToolEvt(), m_controls, PCB_TOOL::m_editModules, m_frame, m_menu, m_mode, TOOL_BASE::m_toolMgr, m_view, PCB_LINE_T, PCB_TEXT_T, BOARD_COMMIT::Push(), KIGFX::VIEW::Remove(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, DRAWSEGMENT::SetAngle(), DRAWSEGMENT::SetBezControl1(), DRAWSEGMENT::SetBezControl2(), DRAWSEGMENT::SetBezierPoints(), EDA_TEXT::SetBold(), DRAWSEGMENT::SetEnd(), EDA_TEXT::SetHorizJustify(), EDA_TEXT::SetItalic(), BOARD_ITEM::SetLayer(), TEXTE_MODULE::SetLocalCoord(), EDA_TEXT::SetMirrored(), EDA_TEXT::SetMultilineAllowed(), DRAWSEGMENT::SetPolyPoints(), DRAWSEGMENT::SetShape(), KIGFX::VIEW_CONTROLS::SetSnapping(), DRAWSEGMENT::SetStart(), EDA_TEXT::SetText(), EDA_TEXT::SetTextPos(), EDA_TEXT::SetTextSize(), EDA_TEXT::SetThickness(), DRAWSEGMENT::SetType(), EDA_TEXT::SetVertJustify(), EDA_TEXT::SetVisible(), DRAWSEGMENT::SetWidth(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), TC_COMMAND, KIGFX::VIEW::Update(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by setTransitions().

683 {
684  if( !m_frame->GetModel() )
685  return 0;
686 
687  DIALOG_DXF_IMPORT dlg( m_frame );
688  int dlgResult = dlg.ShowModal();
689 
690  const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems();
691 
692  if( dlgResult != wxID_OK || list.empty() )
693  return 0;
694 
695  VECTOR2I cursorPos = m_controls->GetCursorPosition();
696  VECTOR2I delta = cursorPos - list.front()->GetPosition();
697 
698  // Add a VIEW_GROUP that serves as a preview for the new item
699  SELECTION preview;
700  BOARD_COMMIT commit( m_frame );
701 
702  // Build the undo list & add items to the current view
703  for( auto item : list )
704  {
705  assert( item->Type() == PCB_LINE_T || item->Type() == PCB_TEXT_T );
706  preview.Add( item );
707  }
708 
709  BOARD_ITEM* firstItem = static_cast<BOARD_ITEM*>( preview.Front() );
710  m_view->Add( &preview );
711 
713  m_controls->ShowCursor( true );
714  m_controls->SetSnapping( true );
715 
716  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DXF );
717 
718  Activate();
719 
720  // Main loop: keep receiving events
721  while( OPT_TOOL_EVENT evt = Wait() )
722  {
723  cursorPos = m_controls->GetCursorPosition();
724 
725  if( evt->IsMotion() )
726  {
727  delta = cursorPos - firstItem->GetPosition();
728 
729  for( auto item : preview )
730  static_cast<BOARD_ITEM*>( item )->Move( wxPoint( delta.x, delta.y ) );
731 
732  m_view->Update( &preview );
733  }
734  else if( evt->Category() == TC_COMMAND )
735  {
736  // TODO it should be handled by EDIT_TOOL, so add items and select?
737  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) )
738  {
739  const auto rotationPoint = wxPoint( cursorPos.x, cursorPos.y );
740  const auto rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle(
741  *m_frame, *evt );
742 
743  for( auto item : preview )
744  {
745  static_cast<BOARD_ITEM*>( item )->Rotate( rotationPoint, rotationAngle );
746  }
747 
748  m_view->Update( &preview );
749  }
750  else if( evt->IsAction( &PCB_ACTIONS::flip ) )
751  {
752  for( auto item : preview )
753  static_cast<BOARD_ITEM*>( item )->Flip( wxPoint( cursorPos.x, cursorPos.y ) );
754 
755  m_view->Update( &preview );
756  }
757  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
758  {
759  preview.FreeItems();
760  break;
761  }
762  }
763  else if( evt->IsClick( BUT_RIGHT ) )
764  {
766  }
767  else if( evt->IsClick( BUT_LEFT ) )
768  {
769  // Place the drawing
771 
772  for( auto item : preview )
773  {
774  if( m_editModules )
775  {
776  // Modules use different types for the same things,
777  // so we need to convert imported items to appropriate classes.
778  BOARD_ITEM* converted = NULL;
779 
780  switch( item->Type() )
781  {
782  case PCB_TEXT_T:
783  {
784  TEXTE_PCB* text = static_cast<TEXTE_PCB*>( item );
785  TEXTE_MODULE* textMod = new TEXTE_MODULE( (MODULE*) parent );
786 
787  // Assignment operator also copies the item PCB_TEXT_T type,
788  // so it cannot be added to a module which handles PCB_MODULE_TEXT_T
789  textMod->SetText( text->GetText() );
790 #if 0
791  textMod->SetTextSize( text->GetTextSize() );
792  textMod->SetThickness( text->GetThickness() );
793  textMod->SetOrientation( text->GetTextAngle() );
794  textMod->SetTextPos( text->GetTextPos() );
795  textMod->SetTextSize( text->GetTextSize() );
796  textMod->SetVisible( text->GetVisible() );
797  textMod->SetMirrored( text->IsMirrored() );
798  textMod->SetItalic( text->IsItalic() );
799  textMod->SetBold( text->IsBold() );
800  textMod->SetHorizJustify( text->GetHorizJustify() );
801  textMod->SetVertJustify( text->GetVertJustify() );
802  textMod->SetMultilineAllowed( text->IsMultilineAllowed() );
803 #else
804  textMod->EDA_TEXT::SetEffects( *text );
805  textMod->SetLocalCoord(); // using changed SetTexPos() via SetEffects()
806 #endif
807  converted = textMod;
808  break;
809  }
810 
811  case PCB_LINE_T:
812  {
813  DRAWSEGMENT* seg = static_cast<DRAWSEGMENT*>( item );
814  EDGE_MODULE* modSeg = new EDGE_MODULE( (MODULE*) parent );
815 
816  // Assignment operator also copies the item PCB_LINE_T type,
817  // so it cannot be added to a module which handles PCB_MODULE_EDGE_T
818  modSeg->SetWidth( seg->GetWidth() );
819  modSeg->SetStart( seg->GetStart() );
820  modSeg->SetEnd( seg->GetEnd() );
821  modSeg->SetAngle( seg->GetAngle() );
822  modSeg->SetShape( seg->GetShape() );
823  modSeg->SetType( seg->GetType() );
824  modSeg->SetBezControl1( seg->GetBezControl1() );
825  modSeg->SetBezControl2( seg->GetBezControl2() );
826  modSeg->SetBezierPoints( seg->GetBezierPoints() );
827  modSeg->SetPolyPoints( seg->GetPolyPoints() );
828  converted = modSeg;
829  break;
830  }
831 
832  default:
833  assert( false );
834  break;
835  }
836 
837  if( converted )
838  converted->SetLayer( static_cast<BOARD_ITEM*>( item )->GetLayer() );
839 
840  delete item;
841  item = converted;
842  }
843 
844  if( item )
845  commit.Add( item );
846  }
847 
848  commit.Push( _( "Place a DXF drawing" ) );
849  break;
850  }
851  }
852 
853  preview.Clear();
854  m_view->Remove( &preview );
855 
856  return 0;
857 }
void SetMirrored(bool isMirrored)
Definition: eda_text.h:178
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.
void SetShape(STROKE_T aShape)
const wxPoint & GetBezControl2() const
bool IsMultilineAllowed() const
Definition: eda_text.h:188
void SetBezierPoints(const std::vector< wxPoint > &aPoints)
const wxPoint & GetTextPos() const
Definition: eda_text.h:224
bool IsItalic() const
Definition: eda_text.h:170
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
void SetType(int aType)
void SetItalic(bool isItalic)
Definition: eda_text.h:169
EDA_ITEM * Front() const
Definition: selection.h:144
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:223
void SetVisible(bool aVisible)
Definition: eda_text.h:175
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
virtual const wxPoint & GetPosition() const =0
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:104
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
const std::vector< wxPoint > & GetPolyPoints() const
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:214
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:190
void SetBezControl2(const wxPoint &aPoint)
static const int delta[8][2]
Definition: solve.cpp:112
bool IsBold() const
Definition: eda_text.h:173
double GetTextAngle() const
Definition: eda_text.h:164
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:154
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
STROKE_T GetShape() const
RAII class that sets an value at construction and resets it to the original value at destruction...
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
void SetVertJustify(EDA_TEXT_VJUSTIFY_T aType)
Definition: eda_text.h:194
const wxPoint & GetBezControl1() const
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
int GetType() const
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1389
void SetMultilineAllowed(bool aAllow)
Function SetMultiLineAllowed.
Definition: eda_text.h:187
void SetStart(const wxPoint &aStart)
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
void SetPolyPoints(const std::vector< wxPoint > &aPoints)
const std::vector< wxPoint > & GetBezierPoints() const
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:191
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:99
void SetLocalCoord()
Set relative coordinates.
double GetAngle() const
void SetHorizJustify(EDA_TEXT_HJUSTIFY_T aType)
Definition: eda_text.h:193
bool IsMirrored() const
Definition: eda_text.h:179
int GetWidth() const
void SetEnd(const wxPoint &aEnd)
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
void SetAngle(double aAngle)
Function SetAngle sets the angle for arcs, and normalizes it within the range 0 - 360 degrees...
void Activate()
Function Activate() Runs the tool.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
const wxSize & GetTextSize() const
Definition: eda_text.h:215
Abstract interface for BOARD_ITEMs capable of storing other items inside.
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:103
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
int GetEventRotationAngle(const PCB_BASE_EDIT_FRAME &aFrame, const TOOL_EVENT &aEvt)
Function getEventRotationAngle()
void SetBold(bool aBold)
Definition: eda_text.h:172
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:148
void SetBezControl1(const wxPoint &aPoint)
virtual void SetText(const wxString &aText)
Definition: eda_text.h:141
void SetWidth(int aWidth)
int DRAWING_TOOL::PlaceText ( const TOOL_EVENT aEvent)

Function PlaceText() Displays a dialog that allows to input text and its settings and then lets the user decide where to place the text in editor.

Definition at line 307 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), EDA_ITEM::ClearFlags(), PCB_ACTIONS::flip, BOARD_ITEM::Flip(), PCB_BASE_FRAME::GetActiveLayer(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), PCB_BASE_FRAME::GetDesignSettings(), TOOL_EVT_UTILS::GetEventRotationAngle(), PCB_BASE_EDIT_FRAME::GetModel(), BOARD_ITEM::GetPosition(), EDA_TEXT::GetText(), ID_MODEDIT_TEXT_TOOL, ID_PCB_ADD_TEXT_BUTT, IS_NEW, IsBackLayer(), TOOL_EVT_UTILS::IsCancelInteractive(), TOOL_EVT_UTILS::IsRotateToolEvt(), m_controls, PCB_TOOL::m_editModules, m_frame, m_menu, m_mode, BOARD_DESIGN_SETTINGS::m_ModuleTextSize, BOARD_DESIGN_SETTINGS::m_ModuleTextWidth, BOARD_DESIGN_SETTINGS::m_PcbTextSize, BOARD_DESIGN_SETTINGS::m_PcbTextWidth, TOOL_BASE::m_toolMgr, m_view, BOARD_COMMIT::Push(), SELECTION::Remove(), KIGFX::VIEW::Remove(), BOARD_ITEM::Rotate(), TOOL_MANAGER::RunAction(), TOOL_INTERACTIVE::RunMainStack(), PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), EDA_ITEM::SetFlags(), BOARD_ITEM::SetLayer(), EDA_TEXT::SetMirrored(), EDA_DRAW_FRAME::SetNoToolSelected(), BOARD_ITEM::SetPosition(), KIGFX::VIEW_CONTROLS::SetSnapping(), EDA_TEXT::SetTextPos(), EDA_TEXT::SetTextSize(), EDA_TEXT::SetThickness(), PCB_BASE_FRAME::SetToolID(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), TC_COMMAND, TEXT, KIGFX::VIEW::Update(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by setTransitions().

308 {
309  BOARD_ITEM* text = NULL;
310  const BOARD_DESIGN_SETTINGS& dsnSettings = m_frame->GetDesignSettings();
311  BOARD_COMMIT commit( m_frame );
312 
313  // Add a VIEW_GROUP that serves as a preview for the new item
314  SELECTION preview;
315 
316  m_view->Add( &preview );
317 
319  m_controls->ShowCursor( true );
320  m_controls->SetSnapping( true );
321  // do not capture or auto-pan until we start placing some text
322 
323  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::TEXT );
324 
325  Activate();
327  wxCURSOR_PENCIL, _( "Add text" ) );
328 
329  // Main loop: keep receiving events
330  while( OPT_TOOL_EVENT evt = Wait() )
331  {
332  VECTOR2I cursorPos = m_controls->GetCursorPosition();
333 
335  {
336  if( text )
337  {
338  // Delete the old text and have another try
339  delete text;
340  text = NULL;
341 
342  preview.Clear();
343 
344  m_controls->SetAutoPan( false );
345  m_controls->CaptureCursor( false );
346  m_controls->ShowCursor( true );
347  }
348  else
349  break;
350 
351  if( evt->IsActivate() ) // now finish unconditionally
352  break;
353  }
354  else if( text && evt->Category() == TC_COMMAND )
355  {
356  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) )
357  {
358  const auto rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle(
359  *m_frame, *evt );
360 
361  text->Rotate( text->GetPosition(), rotationAngle );
362  m_view->Update( &preview );
363  }
364  else if( evt->IsAction( &PCB_ACTIONS::flip ) )
365  {
366  text->Flip( text->GetPosition() );
367  m_view->Update( &preview );
368  }
369  }
370  else if( evt->IsClick( BUT_RIGHT ) )
371  {
373  }
374  else if( evt->IsClick( BUT_LEFT ) )
375  {
376  if( !text )
377  {
378  // Init the new item attributes
379  if( m_editModules )
380  {
381  TEXTE_MODULE* textMod = new TEXTE_MODULE( (MODULE*) m_frame->GetModel() );
382 
383  textMod->SetLayer( m_frame->GetActiveLayer() );
384  textMod->SetTextSize( dsnSettings.m_ModuleTextSize );
385  textMod->SetThickness( dsnSettings.m_ModuleTextWidth );
386  textMod->SetTextPos( wxPoint( cursorPos.x, cursorPos.y ) );
387 
388  DialogEditModuleText textDialog( m_frame, textMod, NULL );
389  bool placing;
390 
391  RunMainStack([&]() {
392  placing = textDialog.ShowModal() && ( textMod->GetText().Length() > 0 );
393  } );
394 
395  if( placing )
396  text = textMod;
397  else
398  delete textMod;
399  }
400  else
401  {
402  TEXTE_PCB* textPcb = new TEXTE_PCB( m_frame->GetModel() );
403  // TODO we have to set IS_NEW, otherwise InstallTextPCB.. creates an undo entry :| LEGACY_CLEANUP
404  textPcb->SetFlags( IS_NEW );
405 
407  textPcb->SetLayer( layer );
408 
409  // Set the mirrored option for layers on the BACK side of the board
410  if( IsBackLayer( layer ) )
411  textPcb->SetMirrored( true );
412 
413  textPcb->SetTextSize( dsnSettings.m_PcbTextSize );
414  textPcb->SetThickness( dsnSettings.m_PcbTextWidth );
415  textPcb->SetTextPos( wxPoint( cursorPos.x, cursorPos.y ) );
416 
417  RunMainStack([&]() {
418  getEditFrame<PCB_EDIT_FRAME>()->InstallTextPCBOptionsFrame( textPcb, NULL );
419  } );
420 
421  if( textPcb->GetText().IsEmpty() )
422  delete textPcb;
423  else
424  text = textPcb;
425  }
426 
427  if( text == NULL )
428  continue;
429 
430  m_controls->CaptureCursor( true );
431  m_controls->SetAutoPan( true );
432  // m_controls->ShowCursor( false );
433 
434  preview.Add( text );
435  }
436  else
437  {
438  // assert( text->GetText().Length() > 0 );
439  // assert( text->GetTextSize().x > 0 && text->GetTextSize().y > 0 );
440 
441  text->ClearFlags();
442  preview.Remove( text );
443 
444  commit.Add( text );
445  commit.Push( _( "Place a text" ) );
446 
447  m_controls->CaptureCursor( false );
448  m_controls->SetAutoPan( false );
449  m_controls->ShowCursor( true );
450 
451  text = NULL;
452  }
453  }
454  else if( text && evt->IsMotion() )
455  {
456  text->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
457 
458  // Show a preview of the item
459  m_view->Update( &preview );
460  }
461  }
462 
463  m_view->Remove( &preview );
465 
466  return 0;
467 }
void SetMirrored(bool isMirrored)
Definition: eda_text.h:178
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.
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:81
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.
virtual void SetPosition(const wxPoint &aPos)=0
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
int m_ModuleTextWidth
Default footprint texts thickness.
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
int m_PcbTextWidth
current Pcb (not module) Text width
void RunMainStack(std::function< void()> aFunc)
Function RunMainStack()
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:223
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
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:214
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
wxSize m_ModuleTextSize
Default footprint texts size.
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:71
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
#define IS_NEW
New item, just created.
Definition: base_struct.h:113
PCB_LAYER_ID
A quick note on layer IDs:
RAII class that sets an value at construction and resets it to the original value at destruction...
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:253
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
wxSize m_PcbTextSize
current Pcb (not module) Text size
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings returns the BOARD_DESIGN_SETTINGS for the BOARD owned by this frame...
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
virtual void Rotate(const wxPoint &aRotCentre, double aAngle)
Function Rotate Rotate this object.
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1389
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
virtual void Flip(const wxPoint &aCentre)
Function Flip Flip this object, i.e.
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:99
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:254
void Activate()
Function Activate() Runs the tool.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
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()
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
virtual PCB_LAYER_ID GetActiveLayer() const
Function GetActiveLayer returns the active layer.
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:148
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:76
void DRAWING_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 197 of file drawing_tool.cpp.

References TOOL_BASE::getView(), TOOL_BASE::getViewControls(), m_board, m_controls, m_frame, and m_view.

198 {
199  // Init variables used by every drawing tool
200  m_view = getView();
202  m_board = getModel<BOARD>();
203  m_frame = getEditFrame<PCB_BASE_EDIT_FRAME>();
204 }
BOARD * m_board
Definition: drawing_tool.h:266
KIGFX::VIEW * m_view
Definition: drawing_tool.h:264
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:36
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:30
void TOOL_INTERACTIVE::RunMainStack ( std::function< void()>  aFunc)
inherited

Function RunMainStack()

Calls a function using the main stack.

Parameters
aFuncis the function to be calls.

Definition at line 85 of file tool_interactive.cpp.

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

Referenced by PlaceText().

86 {
87  m_toolMgr->RunMainStack( this, std::move( aFunc ) );
88 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void RunMainStack(TOOL_BASE *aTool, std::function< void()> aFunc)
void DRAWING_TOOL::runPolygonEventLoop ( POLYGON_GEOM_MANAGER aPolyGeomMgr)
private

Run the event loop for polygon creation, sending user input on to the given POLYGON_GEOM_MANAGER for processing into a complete polygon.

Definition at line 1233 of file drawing_tool.cpp.

References POLYGON_GEOM_MANAGER::AddPoint(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), closeZoneOutline, PCB_TOOL::controls(), POLYGON_GEOM_MANAGER::DEG45, POLYGON_GEOM_MANAGER::DeleteLastCorner(), deleteLastPoint, POLYGON_GEOM_MANAGER::DIRECT, KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_BASE::getViewControls(), TOOL_EVT_UTILS::IsCancelInteractive(), POLYGON_GEOM_MANAGER::IsPolygonInProgress(), m_menu, MD_CTRL, POLYGON_GEOM_MANAGER::NewPointClosesOutline(), POLYGON_GEOM_MANAGER::Reset(), KIGFX::VIEW_CONTROLS::SetAutoPan(), POLYGON_GEOM_MANAGER::SetCursorPosition(), POLYGON_GEOM_MANAGER::SetFinished(), POLYGON_GEOM_MANAGER::SetLeaderMode(), TOOL_MENU::ShowContextMenu(), and TOOL_INTERACTIVE::Wait().

Referenced by drawZone().

1234 {
1235  auto& controls = *getViewControls();
1236  bool started = false;
1237 
1238  while( OPT_TOOL_EVENT evt = Wait() )
1239  {
1240  VECTOR2I cursorPos = controls.GetCursorPosition();
1241 
1243  {
1244  // pre-empted by another tool, give up
1245  // cancelled without an inprogress polygon, give up
1246  if( !polyGeomMgr.IsPolygonInProgress() || evt->IsActivate() )
1247  {
1248  break;
1249  }
1250 
1251  polyGeomMgr.Reset();
1252  // start again
1253  started = false;
1254 
1255  controls.SetAutoPan( false );
1256  controls.CaptureCursor( false );
1257  }
1258  else if( evt->IsClick( BUT_RIGHT ) )
1259  {
1261  }
1262  // events that lock in nodes
1263  else if( evt->IsClick( BUT_LEFT )
1264  || evt->IsDblClick( BUT_LEFT )
1265  || evt->IsAction( &closeZoneOutline ) )
1266  {
1267  // Check if it is double click / closing line (so we have to finish the zone)
1268  const bool endPolygon = evt->IsDblClick( BUT_LEFT )
1269  || evt->IsAction( &closeZoneOutline )
1270  || polyGeomMgr.NewPointClosesOutline( cursorPos );
1271 
1272  if( endPolygon )
1273  {
1274  polyGeomMgr.SetFinished();
1275  polyGeomMgr.Reset();
1276 
1277  // ready to start again
1278  started = false;
1279  controls.SetAutoPan( false );
1280  controls.CaptureCursor( false );
1281  }
1282  else // adding a corner
1283  {
1284  polyGeomMgr.AddPoint( cursorPos );
1285 
1286  if( !started )
1287  {
1288  started = true;
1289  controls.SetAutoPan( true );
1290  controls.CaptureCursor( true );
1291  }
1292  }
1293  }
1294  else if( evt->IsAction( &deleteLastPoint ) )
1295  {
1296  polyGeomMgr.DeleteLastCorner();
1297 
1298  if( !polyGeomMgr.IsPolygonInProgress() )
1299  {
1300  // report finished as an empty shape
1301  polyGeomMgr.SetFinished();
1302 
1303  // start again
1304  started = false;
1305  controls.SetAutoPan( false );
1306  controls.CaptureCursor( false );
1307  }
1308  }
1309  else if( polyGeomMgr.IsPolygonInProgress()
1310  && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
1311  {
1312  bool draw45 = evt->Modifier( MD_CTRL );
1313  polyGeomMgr.SetLeaderMode( draw45 ? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45
1315  polyGeomMgr.SetCursorPosition( cursorPos );
1316  }
1317  } // end while
1318 }
static TOOL_ACTION closeZoneOutline("pcbnew.InteractiveDrawing.closeZoneOutline", AS_CONTEXT, 0, _("Close Zone Outline"), _("Close the outline of a zone in progress"), checked_ok_xpm)
static TOOL_ACTION deleteLastPoint("pcbnew.InteractiveDrawing.deleteLastPoint", AS_CONTEXT, WXK_BACK, _("Delete Last Point"), _("Delete the last point added to the current item"), undo_xpm)
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:124
Unconstrained point-to-point
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
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 ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
int DRAWING_TOOL::SetAnchor ( const TOOL_EVENT aEvent)

Function SetAnchor() Places the footprint anchor (only in module editor).

Definition at line 860 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), ANCHOR, BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), PCB_BASE_EDIT_FRAME::GetModel(), MODULE::GetPosition(), ID_MODEDIT_ANCHOR_TOOL, TOOL_EVT_UTILS::IsCancelInteractive(), m_controls, PCB_TOOL::m_editModules, m_frame, m_menu, m_mode, COMMIT::Modify(), MODULE::MoveAnchorPosition(), BOARD_COMMIT::Push(), KIGFX::VIEW_CONTROLS::SetAutoPan(), EDA_DRAW_FRAME::SetNoToolSelected(), KIGFX::VIEW_CONTROLS::SetSnapping(), PCB_BASE_FRAME::SetToolID(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by setTransitions().

861 {
862  assert( m_editModules );
863 
864  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ANCHOR );
865 
866  Activate();
867  m_frame->SetToolID( ID_MODEDIT_ANCHOR_TOOL, wxCURSOR_PENCIL,
868  _( "Place the footprint anchor" ) );
869 
870  m_controls->ShowCursor( true );
871  m_controls->SetSnapping( true );
872  m_controls->SetAutoPan( true );
873  m_controls->CaptureCursor( false );
874 
875  while( OPT_TOOL_EVENT evt = Wait() )
876  {
877  if( evt->IsClick( BUT_LEFT ) )
878  {
879  MODULE* module = (MODULE*) m_frame->GetModel();
880  BOARD_COMMIT commit( m_frame );
881  commit.Modify( module );
882 
883  // set the new relative internal local coordinates of footprint items
884  VECTOR2I cursorPos = m_controls->GetCursorPosition();
885  wxPoint moveVector = module->GetPosition() - wxPoint( cursorPos.x, cursorPos.y );
886  module->MoveAnchorPosition( moveVector );
887 
888  commit.Push( _( "Move the footprint reference anchor" ) );
889 
890  // Usually, we do not need to change twice the anchor position,
891  // so deselect the active tool
892  break;
893  }
894  else if( evt->IsClick( BUT_RIGHT ) )
895  {
897  }
898  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
899  break;
900  }
901 
903 
904  return 0;
905 }
virtual void ShowCursor(bool aEnabled)
Function ShowCursor() Enables or disables display of cursor.
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.
const wxPoint & GetPosition() const override
Definition: class_module.h:155
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 MoveAnchorPosition(const wxPoint &aMoveVector)
Function MoveAnchorPosition Move the reference point of the footprint It looks like a move footprint:...
RAII class that sets an value at construction and resets it to the original value at destruction...
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area. ...
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:265
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual void SetAutoPan(bool aEnabled)
Function SetAutoPan Turns on/off auto panning (this feature is used when there is a tool active (eg...
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:267
bool m_editModules
Definition: pcb_tool.h:128
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:560
void Activate()
Function Activate() Runs the tool.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:62
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:274
void TOOL_INTERACTIVE::SetContextMenu ( CONTEXT_MENU aMenu,
CONTEXT_MENU_TRIGGER  aTrigger = CMENU_BUTTON 
)
inherited

Function SetContextMenu()

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

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

Definition at line 74 of file tool_interactive.cpp.

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

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

75 {
76  if( aMenu )
77  aMenu->SetTool( this );
78  else
79  aTrigger = CMENU_OFF;
80 
81  m_toolMgr->ScheduleContextMenu( this, aMenu, aTrigger );
82 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:213
void ScheduleContextMenu(TOOL_BASE *aTool, CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger)
Sets behaviour of the tool's context popup menu.
void SetTool(TOOL_INTERACTIVE *aTool)
Function SetTool() Sets a tool that is the creator of the menu.
void PCB_TOOL::SetEditModules ( bool  aEnabled)
inlineinherited

Function SetEditModules()

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

Parameters
aEnableddecides if the mode should be enabled.

Definition at line 86 of file pcb_tool.h.

References PCB_TOOL::m_editModules.

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

Sets up handlers for various events.

Implements TOOL_INTERACTIVE.

Definition at line 1531 of file drawing_tool.cpp.

References DrawArc(), PCB_ACTIONS::drawArc, DrawCircle(), PCB_ACTIONS::drawCircle, DrawDimension(), PCB_ACTIONS::drawDimension, DrawLine(), PCB_ACTIONS::drawLine, PCB_ACTIONS::drawSimilarZone, DrawSimilarZone(), DrawVia(), PCB_ACTIONS::drawVia, DrawZone(), PCB_ACTIONS::drawZone, DrawZoneCutout(), PCB_ACTIONS::drawZoneCutout, DrawZoneKeepout(), PCB_ACTIONS::drawZoneKeepout, TOOL_INTERACTIVE::Go(), PCB_ACTIONS::placeDXF, PlaceDXF(), PlaceText(), PCB_ACTIONS::placeText, PCB_ACTIONS::setAnchor, and SetAnchor().

1532 {
1545 }
static TOOL_ACTION drawLine
Activation of the drawing tool (line)
Definition: pcb_actions.h:133
int DrawCircle(const TOOL_EVENT &aEvent)
Function DrawCircle() Starts interactively drawing a circle.
static TOOL_ACTION placeDXF
Activation of the drawing tool (placing a drawing from DXF file)
Definition: pcb_actions.h:169
int DrawVia(const TOOL_EVENT &aEvent)
int DrawZone(const TOOL_EVENT &aEvent)
Function DrawZone() Starts interactively drawing a zone.
static TOOL_ACTION drawSimilarZone
Activation of the drawing tool (drawing a similar ZONE to another one)
Definition: pcb_actions.h:160
static TOOL_ACTION drawArc
Activation of the drawing tool (arc)
Definition: pcb_actions.h:139
int DrawLine(const TOOL_EVENT &aEvent)
Function DrawLine() Starts interactively drawing a line.
static TOOL_ACTION drawZoneKeepout
Activation of the drawing tool (drawing a keepout area)
Definition: pcb_actions.h:154
static TOOL_ACTION setAnchor
Activation of the drawing tool (placing the footprint anchor)
Definition: pcb_actions.h:172
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
static TOOL_ACTION placeText
Activation of the drawing tool (text)
Definition: pcb_actions.h:142
int PlaceDXF(const TOOL_EVENT &aEvent)
Function PlaceDXF() Places a drawing imported from a DXF file in module editor.
int PlaceText(const TOOL_EVENT &aEvent)
Function PlaceText() Displays a dialog that allows to input text and its settings and then lets the u...
static TOOL_ACTION drawDimension
Activation of the drawing tool (dimension)
Definition: pcb_actions.h:145
int DrawZoneKeepout(const TOOL_EVENT &aEvent)
Function DrawZoneKeepout() Starts interactively drawing a keepout area.
static TOOL_ACTION drawVia
Activation of the drawing tool (drawing a VIA)
Definition: pcb_actions.h:151
static TOOL_ACTION drawZoneCutout
Activation of the drawing tool (drawing a ZONE cutout)
Definition: pcb_actions.h:157
int DrawZoneCutout(const TOOL_EVENT &aEvent)
Function DrawZoneCutout() Starts interactively drawing a zone cutout area of an existing zone...
static TOOL_ACTION drawCircle
Activation of the drawing tool (circle)
Definition: pcb_actions.h:136
int SetAnchor(const TOOL_EVENT &aEvent)
Function SetAnchor() Places the footprint anchor (only in module editor).
int DrawSimilarZone(const TOOL_EVENT &aEvent)
Function DrawSimilarZone() Starts interactively drawing a zone with same settings as an existing zone...
int DrawArc(const TOOL_EVENT &aEvent)
Function DrawArc() Starts interactively drawing an arc.
static TOOL_ACTION drawZone
Activation of the drawing tool (drawing a ZONE)
Definition: pcb_actions.h:148
int DrawDimension(const TOOL_EVENT &aEvent)
Function DrawDimension() Starts interactively drawing a dimension.
void DRAWING_TOOL::showContextMenu ( )
private

Shows the context menu for the drawing tool This menu consists of normal UI functions (zoom, grid, etc) And any suitable global functions for the active drawing type.

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(), drawArc(), DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), drawSegment(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::InlineDrag(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PlaceText(), runPolygonEventLoop(), SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectPoint(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), ZOOM_TOOL::selectRegion(), SetAnchor(), and PCB_EDITOR_CONTROL::ShowLocalRatsnest().

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

Friends And Related Function Documentation

friend class ZONE_CREATE_HELPER
friend

Definition at line 281 of file drawing_tool.h.

Member Data Documentation

BOARD* DRAWING_TOOL::m_board
private

Definition at line 266 of file drawing_tool.h.

Referenced by DrawDimension(), DrawVia(), getSegmentWidth(), and Reset().

KIGFX::VIEW_CONTROLS* DRAWING_TOOL::m_controls
private
unsigned int DRAWING_TOOL::m_lineWidth
private

Stores the current line width for multisegment drawing.

Definition at line 271 of file drawing_tool.h.

Referenced by DrawArc(), drawArc(), DrawCircle(), DrawDimension(), DrawLine(), and drawSegment().

TOOL_MENU DRAWING_TOOL::m_menu
private

Menu model displayed by the tool.

Definition at line 274 of file drawing_tool.h.

Referenced by drawArc(), DrawDimension(), drawSegment(), GetToolMenu(), Init(), PlaceDXF(), PlaceText(), runPolygonEventLoop(), and SetAnchor().

TOOL_ID TOOL_BASE::m_toolId
protectedinherited

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

Definition at line 208 of file tool_base.h.

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

TOOL_MANAGER* TOOL_BASE::m_toolMgr
protectedinherited

Definition at line 213 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PCBNEW_CONTROL::AppendBoard(), PAD_TOOL::applyPadSettings(), TOOL_BASE::attachManager(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), 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(), drawArc(), DrawDimension(), drawSegment(), drawZone(), PCB_EDITOR_CONTROL::DrillOrigin(), EDIT_TOOL::Duplicate(), EDIT_TOOL::editFootprintInFpEditor(), MODULE_EDITOR_TOOLS::EnumeratePads(), EDIT_TOOL::ExchangeFootprints(), SELECTION_TOOL::findCallback(), SELECTION_TOOL::findMove(), EDIT_TOOL::Flip(), TOOL_BASE::getEditFrameInt(), TOOL_BASE::GetManager(), TOOL_BASE::getModelInt(), EDIT_TOOL::getModificationPoint(), getSourceZoneForAction(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_INTERACTIVE::goInternal(), PCBNEW_CONTROL::GridSetOrigin(), PCB_EDITOR_CONTROL::HighlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), ALIGN_DISTRIBUTE_TOOL::Init(), PAD_TOOL::Init(), POINT_EDITOR::Init(), PCB_EDITOR_CONTROL::Init(), POSITION_RELATIVE_TOOL::Init(), EDIT_TOOL::Init(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::invokeInlineRouter(), ZOOM_TOOL::Main(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), EDIT_TOOL::Mirror(), PCB_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), MODULE_EDITOR_TOOLS::PasteItems(), PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PlaceText(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), EDIT_TOOL::Remove(), SELECTION_TOOL::RequestSelection(), TOOL_INTERACTIVE::resetTransitions(), EDIT_TOOL::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::UpdateSelectionRatsnest(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), TOOL_INTERACTIVE::Wait(), PCB_EDITOR_CONTROL::ZoneDuplicate(), PCB_EDITOR_CONTROL::ZoneFill(), PCB_EDITOR_CONTROL::ZoneMerge(), and PCB_EDITOR_CONTROL::ZoneUnfill().

std::string TOOL_BASE::m_toolName
protectedinherited

Name of the tool.

Names are expected to obey the format application.ToolName

(eg. pcbnew.InteractiveSelection).

Definition at line 212 of file tool_base.h.

Referenced by TOOL_BASE::GetName().

TOOL_SETTINGS TOOL_BASE::m_toolSettings
protectedinherited

Definition at line 214 of file tool_base.h.

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

TOOL_TYPE TOOL_BASE::m_type
protectedinherited

Stores the type of the tool.

Definition at line 205 of file tool_base.h.

Referenced by TOOL_BASE::GetType().

KIGFX::VIEW* DRAWING_TOOL::m_view
private

Definition at line 264 of file drawing_tool.h.

Referenced by drawArc(), DrawDimension(), drawSegment(), PlaceDXF(), PlaceText(), and Reset().

const unsigned int DRAWING_TOOL::WIDTH_STEP = 100000
staticprivate

Definition at line 277 of file drawing_tool.h.

Referenced by drawArc(), DrawDimension(), and drawSegment().


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