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, MODE::GRAPHIC_POLYGON
}
 

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 DrawGraphicPolygon (const TOOL_EVENT &aEvent)
 
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 ()
 
bool IsToolActive () const
 

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::PCB_VIEWview () const
 
KIGFX::VIEW_CONTROLScontrols () const
 
PCB_EDIT_FRAMEframe () const
 
BOARDboard () const
 
MODULEmodule () const
 
PCB_DISPLAY_OPTIONSdisplayOptions () const
 
PCB_DRAW_PANEL_GALcanvas () const
 
const SELECTIONselection () const
 
SELECTIONselection ()
 
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, ZONE_MODE::GRAPHIC_POLYGON }
 

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, OPT< VECTOR2D > aStartingPoint=NULLOPT)
 

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...
 
void constrainDimension (DIMENSION *dimension)
 Function constrainDimension() Forces the dimension lime to be drawn on 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 106 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 
GRAPHIC_POLYGON 

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  GRAPHIC_POLYGON
81  };
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.

GRAPHIC_POLYGON 

Definition at line 186 of file drawing_tool.h.

187  {
188  ADD,
189  CUTOUT,
190  SIMILAR,
191  GRAPHIC_POLYGON
192  };
Definition: am_param.h:150

Constructor & Destructor Documentation

DRAWING_TOOL::DRAWING_TOOL ( )

Definition at line 151 of file drawing_tool.cpp.

151  :
152  PCB_TOOL( "pcbnew.InteractiveDrawing" ),
153  m_view( nullptr ), m_controls( nullptr ),
154  m_board( nullptr ), m_frame( nullptr ), m_mode( MODE::NONE ),
155  m_lineWidth( 1 ),
156  m_menu( *this )
157 {
158 }
BOARD * m_board
Definition: drawing_tool.h:276
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
PCB_TOOL(TOOL_ID aId, const std::string &aName)
Constructor.
Definition: pcb_tool.h:71
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:281
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:284
DRAWING_TOOL::~DRAWING_TOOL ( )

Definition at line 161 of file drawing_tool.cpp.

162 {
163 }

Member Function Documentation

void TOOL_INTERACTIVE::Activate ( )
inherited
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 59 of file tool_base.cpp.

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

Referenced by TOOL_MANAGER::RegisterTool().

60 {
61  m_toolMgr = aManager;
62  m_toolSettings = TOOL_SETTINGS( this );
63 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:216
friend class TOOL_SETTINGS
Definition: tool_base.h:155
BOARD* PCB_TOOL::board ( ) const
inlineprotectedinherited

Definition at line 137 of file pcb_tool.h.

Referenced by PCBNEW_CONTROL::AppendBoard(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), EDIT_TOOL::changeTrackWidthOnClick(), EDIT_TOOL::copyToClipboard(), MICROWAVE_TOOL::createInductorBetween(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), ROUTER_TOOL::CustomTrackWidthDialog(), PCB_TOOL::doInteractiveItemPlacement(), drawArc(), DrawDimension(), drawSegment(), MODULE_EDITOR_TOOLS::EnumeratePads(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), SELECTION_TOOL::filterSelection(), POINT_EDITOR::finishItem(), SELECTION_TOOL::getCollectorsGuide(), ROUTER_TOOL::getNetclassDimensions(), PCBNEW_CONTROL::GraphicDisplayMode(), PAD_TOOL::haveFootprints(), highlightNet(), PCBNEW_CONTROL::LayerNext(), PCBNEW_CONTROL::LayerPrev(), ROUTER_TOOL::mainLoop(), PCBNEW_CONTROL::ModuleEdgeOutlines(), PCBNEW_CONTROL::ModuleTextOutlines(), POINT_EDITOR::OnSelectionChange(), ROUTER_TOOL::onTrackViaSizeChanged(), ROUTER_TOOL::onViaCommand(), PCBNEW_CONTROL::PadDisplayMode(), PCBNEW_CONTROL::PasteItemsFromClipboard(), PCBNEW_CONTROL::placeBoardItems(), MODULE_EDITOR_TOOLS::PlacePad(), PCB_EDITOR_CONTROL::PlaceTarget(), PlaceText(), ROUTER_TOOL::prepareInteractive(), PNS::TOOL_BASE::Reset(), PCBNEW_CONTROL::Reset(), SELECTION_TOOL::selectable(), SELECTION_TOOL::selectAllItemsConnectedToItem(), SELECTION_TOOL::selectAllItemsConnectedToTrack(), SELECTION_TOOL::selectAllItemsOnNet(), SELECTION_TOOL::selectAllItemsOnSheet(), SELECTION_TOOL::selectPoint(), PCB_EDITOR_CONTROL::ShowLocalRatsnest(), PCBNEW_CONTROL::TrackDisplayMode(), PCB_EDITOR_CONTROL::TrackWidthDec(), PCB_EDITOR_CONTROL::TrackWidthInc(), PCBNEW_CONTROL::ViaDisplayMode(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), PCBNEW_CONTROL::ZoneDisplayMode(), ZONE_FILLER_TOOL::ZoneFill(), ZONE_FILLER_TOOL::ZoneFillAll(), PCB_EDITOR_CONTROL::ZoneMerge(), and ZONE_FILLER_TOOL::ZoneUnfillAll().

137 { return getModel<BOARD>(); }
PCB_DRAW_PANEL_GAL * PCB_TOOL::canvas ( ) const
protectedinherited
void DRAWING_TOOL::constrainDimension ( DIMENSION dimension)
private

Function constrainDimension() Forces the dimension lime to be drawn on multiple of 45 degrees.

Parameters
aDimensionis the dimension element currently being drawn

Definition at line 476 of file drawing_tool.cpp.

References PNS::angle(), DIMENSION::GetEnd(), DIMENSION::GetOrigin(), KiROUND(), VECTOR2< T >::Rotate(), and DIMENSION::SetEnd().

Referenced by DrawDimension().

477 {
478  VECTOR2I lineVector( dimension->GetEnd() - dimension->GetOrigin() );
479  double angle = lineVector.Angle();
480  double newAngle = KiROUND( angle / M_PI_4 ) * M_PI_4;
481  VECTOR2I newLineVector = lineVector.Rotate( newAngle - angle );
482 
483  dimension->SetEnd( dimension->GetOrigin() + static_cast<wxPoint>( newLineVector ) );
484 }
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:106
VECTOR2< T > Rotate(double aAngle) const
Function Rotate rotates the vector by a given angle.
Definition: vector2d.h:372
const wxPoint & GetEnd()
Function GetEnd.
const wxPoint & GetOrigin() const
Function GetOrigin.
void SetEnd(const wxPoint &aEnd)
Function SetEnd Sets a new end of the crossbar line.
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
PCB_DISPLAY_OPTIONS * PCB_TOOL::displayOptions ( ) const
protectedinherited

Definition at line 211 of file pcb_tool.cpp.

References PCB_TOOL::frame(), and PCB_BASE_FRAME::GetDisplayOptions().

Referenced by PCBNEW_CONTROL::GraphicDisplayMode(), PCBNEW_CONTROL::HighContrastMode(), PCBNEW_CONTROL::ModuleEdgeOutlines(), PCBNEW_CONTROL::ModuleTextOutlines(), PCBNEW_CONTROL::PadDisplayMode(), PNS::TOOL_BASE::pickSingleItem(), PCBNEW_CONTROL::TrackDisplayMode(), PCBNEW_CONTROL::ViaDisplayMode(), and PCBNEW_CONTROL::ZoneDisplayMode().

212 {
213  return static_cast<PCB_DISPLAY_OPTIONS*>( frame()->GetDisplayOptions() );
214 }
void * GetDisplayOptions() override
Function GetDisplayOptions returns the display options current in use Display options are relative to...
Class PCB_DISPLAY_OPTIONS handles display options like enable/disable some optional drawings...
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:136
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 39 of file pcb_tool.cpp.

References TOOL_INTERACTIVE::Activate(), KIGFX::PCB_VIEW::Add(), KIGFX::VIEW_GROUP::Add(), SELECTION::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, INTERACTIVE_PLACER_BASE::m_modifiers, PCB_TOOL::module(), PCB_MODULE_T, INTERACTIVE_PLACER_BASE::PlaceItem(), BOARD_COMMIT::Push(), KIGFX::PCB_VIEW::Remove(), KIGFX::VIEW_GROUP::Remove(), SELECTION::Remove(), TOOL_MANAGER::RunAction(), MODULE::RunOnChildren(), PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), KIGFX::VIEW_CONTROLS::SetSnapping(), KIGFX::VIEW_CONTROLS::ShowCursor(), INTERACTIVE_PLACER_BASE::SnapItem(), TC_COMMAND, KIGFX::PCB_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().

42 {
43  using namespace std::placeholders;
44  std::unique_ptr<BOARD_ITEM> newItem;
45 
46  Activate();
47 
48  BOARD_COMMIT commit( frame() );
49 
51 
52  // do not capture or auto-pan until we start placing an item
53  controls()->ShowCursor( true );
54  controls()->SetSnapping( true );
55 
56  // Add a VIEW_GROUP that serves as a preview for the new item
57  SELECTION preview;
58  view()->Add( &preview );
59 
60  aPlacer->m_board = board();
61  aPlacer->m_frame = frame();
62  aPlacer->m_modifiers = 0;
63 
64  if( aOptions & IPO_SINGLE_CLICK )
65  {
66  VECTOR2I cursorPos = controls()->GetCursorPosition();
67 
68  newItem = aPlacer->CreateItem();
69  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
70 
71  preview.Add( newItem.get() );
72  }
73 
74  // Main loop: keep receiving events
75  while( OPT_TOOL_EVENT evt = Wait() )
76  {
77  VECTOR2I cursorPos = controls()->GetCursorPosition();
78  aPlacer->m_modifiers = evt->Modifier();
79 
81  {
82  if( newItem )
83  {
84  // Delete the old item and have another try
85  newItem = nullptr;
86 
87  preview.Clear();
88 
89  if( aOptions & IPO_SINGLE_CLICK )
90  break;
91 
92  controls()->SetAutoPan( false );
93  controls()->CaptureCursor( false );
94  controls()->ShowCursor( true );
95  }
96  else
97  {
98  break;
99  }
100 
101  if( evt->IsActivate() ) // now finish unconditionally
102  break;
103  }
104 
105  else if( evt->IsClick( BUT_LEFT ) )
106  {
107  if( !newItem )
108  {
109  // create the item if possible
110  newItem = aPlacer->CreateItem();
111 
112  // no item created, so wait for another click
113  if( !newItem )
114  continue;
115 
116  controls()->CaptureCursor( true );
117  controls()->SetAutoPan( true );
118 
119  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
120 
121  preview.Add( newItem.get() );
122 
123  if( newItem->Type() == PCB_MODULE_T )
124  {
125  auto module = dyn_cast<MODULE*>( newItem.get() );
126 
127  // modules have more drawable parts
128  module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) );
129  }
130  }
131  else
132  {
133  newItem->ClearFlags();
134  preview.Remove( newItem.get() );
135 
136  aPlacer->PlaceItem( newItem.get(), commit );
137 
138  if( newItem->Type() == PCB_MODULE_T )
139  {
140  auto module = dyn_cast<MODULE*>( newItem.get() );
141  module->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Remove, &preview, _1 ) );
142  }
143 
144  newItem.release();
145  commit.Push( aCommitMessage );
146 
147  controls()->CaptureCursor( false );
148  controls()->SetAutoPan( false );
149  controls()->ShowCursor( true );
150 
151  if( !( aOptions & IPO_REPEAT ) )
152  break;
153 
154  if( aOptions & IPO_SINGLE_CLICK )
155  {
157 
158  newItem = aPlacer->CreateItem();
159  newItem->SetPosition( wxPoint( pos.x, pos.y ) );
160 
161  preview.Add( newItem.get() );
162  }
163  }
164  }
165 
166  else if( newItem && evt->Category() == TC_COMMAND )
167  {
168  /*
169  * Handle any events that can affect the item as we move
170  * it around, eg rotate and flip
171  */
172 
173  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) && ( aOptions & IPO_ROTATE ) )
174  {
175  const auto rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle(
176  *frame(), *evt );
177  newItem->Rotate( newItem->GetPosition(), rotationAngle );
178  view()->Update( &preview );
179  }
180  else if( evt->IsAction( &PCB_ACTIONS::flip ) && ( aOptions & IPO_FLIP ) )
181  {
182  newItem->Flip( newItem->GetPosition() );
183  view()->Update( &preview );
184  }
185  }
186 
187  else if( newItem && evt->IsMotion() )
188  {
189  // track the cursor
190  newItem->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
191  aPlacer->SnapItem( newItem.get() );
192 
193  // Show a preview of the item
194  view()->Update( &preview );
195  }
196  }
197 
198  view()->Remove( &preview );
199 }
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 PlaceItem(BOARD_ITEM *aItem, BOARD_COMMIT &aCommit)
Definition: pcb_tool.cpp:241
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:84
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction)
Function RunOnChildren.
virtual void Update(VIEW_ITEM *aItem, int aUpdateFlags) override
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: pcb_view.cpp:81
virtual std::unique_ptr< BOARD_ITEM > CreateItem()=0
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:58
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:61
virtual void Remove(VIEW_ITEM *aItem) override
Function Remove() Removes a VIEW_ITEM from the view.
Definition: pcb_view.cpp:64
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:74
virtual void SnapItem(BOARD_ITEM *aItem)
Definition: pcb_tool.cpp:236
KIGFX::VIEW_CONTROLS * controls() const
Definition: pcb_tool.h:135
class MODULE, a footprint
Definition: typeinfo.h:89
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:136
MODULE * module() const
Definition: pcb_tool.h:138
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
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:102
KIGFX::PCB_VIEW * view() const
Definition: pcb_tool.h:134
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.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Function Add() Adds a VIEW_ITEM to the view.
Definition: pcb_view.cpp:48
int GetEventRotationAngle(const PCB_BASE_EDIT_FRAME &aFrame, const TOOL_EVENT &aEvt)
Function getEventRotationAngle()
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
BOARD * board() const
Definition: pcb_tool.h:137
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:79
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 290 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().

291 {
292  if( m_editModules && !m_frame->GetModel() )
293  return 0;
294 
296  DRAWSEGMENT* arc = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
297  BOARD_COMMIT commit( m_frame );
298 
299  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ARC );
300 
302  wxCURSOR_PENCIL, _( "Add graphic arc" ) );
304 
305  while( drawArc( arc ) )
306  {
307  if( arc )
308  {
309  commit.Add( arc );
310  commit.Push( _( "Draw an arc" ) );
311  }
312 
313  arc = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
314  }
315 
317 
318  return 0;
319 }
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:281
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
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 1175 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), KIGFX::VIEW::Add(), KIGFX::PREVIEW::MULTISTEP_GEOM_MANAGER::AddPoint(), PCB_ACTIONS::arcPosture, PCB_TOOL::board(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), PCB_ACTIONS::decWidth, deleteLastPoint, PCB_TOOL::frame(), 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(), EDA_DRAW_FRAME::SetMsgPanel(), 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().

1176 {
1178 
1179  // Arc geometric construction manager
1181 
1182  // Arc drawing assistant overlay
1183  KIGFX::PREVIEW::ARC_ASSISTANT arcAsst( arcManager );
1184 
1185  // Add a VIEW_GROUP that serves as a preview for the new item
1186  SELECTION preview;
1187  m_view->Add( &preview );
1188  m_view->Add( &arcAsst );
1189 
1190  m_controls->ShowCursor( true );
1191  m_controls->SetSnapping( true );
1192 
1193  Activate();
1194 
1195  bool firstPoint = false;
1196 
1197  // Main loop: keep receiving events
1198  while( OPT_TOOL_EVENT evt = Wait() )
1199  {
1200  const VECTOR2I cursorPos = m_controls->GetCursorPosition();
1201 
1202  if( evt->IsClick( BUT_LEFT ) )
1203  {
1204  if( !firstPoint )
1205  {
1206  m_controls->SetAutoPan( true );
1207  m_controls->CaptureCursor( true );
1208 
1209  PCB_LAYER_ID layer = getDrawingLayer();
1210 
1211  // Init the new item attributes
1212  // (non-geometric, those are handled by the manager)
1213  aGraphic->SetShape( S_ARC );
1214  aGraphic->SetWidth( m_lineWidth );
1215  aGraphic->SetLayer( layer );
1216 
1217  preview.Add( aGraphic );
1218  firstPoint = true;
1219  }
1220 
1221  arcManager.AddPoint( cursorPos, true );
1222  }
1223  else if( evt->IsAction( &deleteLastPoint ) )
1224  {
1225  arcManager.RemoveLastPoint();
1226  }
1227  else if( evt->IsMotion() )
1228  {
1229  // set angle snap
1230  arcManager.SetAngleSnap( evt->Modifier( MD_CTRL ) );
1231 
1232  // update, but don't step the manager state
1233  arcManager.AddPoint( cursorPos, false );
1234  }
1235  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
1236  {
1237  preview.Clear();
1238  delete aGraphic;
1239  aGraphic = nullptr;
1240  break;
1241  }
1242  else if( evt->IsClick( BUT_RIGHT ) )
1243  {
1245  }
1246  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) )
1247  {
1249  aGraphic->SetWidth( m_lineWidth );
1250  m_view->Update( &preview );
1251  frame()->SetMsgPanel( aGraphic );
1252  }
1253  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && m_lineWidth > WIDTH_STEP )
1254  {
1256  aGraphic->SetWidth( m_lineWidth );
1257  m_view->Update( &preview );
1258  frame()->SetMsgPanel( aGraphic );
1259  }
1260  else if( evt->IsAction( &PCB_ACTIONS::arcPosture ) )
1261  {
1262  arcManager.ToggleClockwise();
1263  }
1264 
1265  if( arcManager.IsComplete() )
1266  {
1267  break;
1268  }
1269  else if( arcManager.HasGeometryChanged() )
1270  {
1271  updateArcFromConstructionMgr( arcManager, *aGraphic );
1272  m_view->Update( &preview );
1273  m_view->Update( &arcAsst );
1274 
1275  if(firstPoint)
1276  frame()->SetMsgPanel( aGraphic );
1277  else
1278  frame()->SetMsgPanel( board() );
1279  }
1280  }
1281 
1282  preview.Remove( aGraphic );
1283  m_view->Remove( &arcAsst );
1284  m_view->Remove( &preview );
1285  frame()->SetMsgPanel( board() );
1286  m_controls->SetAutoPan( false );
1287  m_controls->CaptureCursor( false );
1288 
1289  return !arcManager.IsReset();
1290 }
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:84
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:184
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:287
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:364
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:187
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:74
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
PCB_LAYER_ID
A quick note on layer IDs:
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Function SetMsgPanel clears the message panel and populates it with the contents of aList...
Definition: draw_frame.cpp:831
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)
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:136
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:281
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual 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:1499
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:190
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)
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:334
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:284
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
BOARD * board() const
Definition: pcb_tool.h:137
void SetWidth(int aWidth)
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:79
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 258 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().

259 {
260  if( m_editModules && !m_frame->GetModel() )
261  return 0;
262 
264  DRAWSEGMENT* circle = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
265  BOARD_COMMIT commit( m_frame );
266 
267  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::CIRCLE );
268 
270  wxCURSOR_PENCIL, _( "Add graphic circle" ) );
272 
273  while( drawSegment( S_CIRCLE, circle ) )
274  {
275  if( circle )
276  {
277  commit.Add( circle );
278  commit.Push( _( "Draw a circle" ) );
279  }
280 
281  circle = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
282  }
283 
285 
286  return 0;
287 }
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, OPT< VECTOR2D > aStartingPoint=NULLOPT)
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:281
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
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 487 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), DIMENSION::AdjustDimensionDetails(), PNS::angle(), PCB_TOOL::board(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), Clamp_Text_PenSize(), SELECTION::Clear(), constrainDimension(), PCB_ACTIONS::decWidth, delta, DIMENSION, Dwgs_User, Edge_Cuts, PCB_TOOL::frame(), DIMENSION::GetAngle(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), BOARD::GetDesignSettings(), getDrawingLayer(), DIMENSION::GetEnd(), PCB_BASE_EDIT_FRAME::GetModel(), 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, PCB_TOOL::m_editModules, 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, MD_CTRL, 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::SetMsgPanel(), 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().

488 {
489  if( m_editModules && !m_frame->GetModel() )
490  return 0;
491 
492  DIMENSION* dimension = NULL;
493  BOARD_COMMIT commit( m_frame );
494  int maxThickness;
495 
496  // Add a VIEW_GROUP that serves as a preview for the new item
497  SELECTION preview;
498 
499  m_view->Add( &preview );
500 
502  m_controls->ShowCursor( true );
503  m_controls->SetSnapping( true );
504 
505  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DIMENSION );
506 
507  Activate();
508  m_frame->SetToolID( ID_PCB_DIMENSION_BUTT, wxCURSOR_PENCIL, _( "Add dimension" ) );
510 
511  enum DIMENSION_STEPS
512  {
513  SET_ORIGIN = 0,
514  SET_END,
515  SET_HEIGHT,
516  FINISHED
517  };
518  int step = SET_ORIGIN;
519 
520  // Main loop: keep receiving events
521  while( OPT_TOOL_EVENT evt = Wait() )
522  {
523  VECTOR2I cursorPos = m_controls->GetCursorPosition();
524 
526  {
527  if( step != SET_ORIGIN ) // start from the beginning
528  {
529  preview.Clear();
530 
531  delete dimension;
532  step = SET_ORIGIN;
533  }
534  else
535  break;
536 
537  if( evt->IsActivate() ) // now finish unconditionally
538  break;
539  }
540  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) && step != SET_ORIGIN )
541  {
543  dimension->SetWidth( m_lineWidth );
544  m_view->Update( &preview );
545  frame()->SetMsgPanel( dimension );
546  }
547  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && step != SET_ORIGIN )
548  {
549  if( m_lineWidth > WIDTH_STEP )
550  {
552  dimension->SetWidth( m_lineWidth );
553  m_view->Update( &preview );
554  frame()->SetMsgPanel( dimension );
555  }
556  }
557  else if( evt->IsClick( BUT_RIGHT ) )
558  {
560  }
561  else if( evt->IsClick( BUT_LEFT ) )
562  {
563  switch( step )
564  {
565  case SET_ORIGIN:
566  {
567  PCB_LAYER_ID layer = getDrawingLayer();
568 
569  if( layer == Edge_Cuts ) // dimensions are not allowed on EdgeCuts
570  layer = Dwgs_User;
571 
572  // Init the new item attributes
573  dimension = new DIMENSION( m_board );
574  dimension->SetLayer( layer );
575  dimension->SetOrigin( wxPoint( cursorPos.x, cursorPos.y ) );
576  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
578 
580  maxThickness = Clamp_Text_PenSize( width, dimension->Text().GetTextSize() );
581 
582  if( width > maxThickness )
583  width = maxThickness;
584 
585  dimension->Text().SetThickness( width );
586  dimension->SetWidth( width );
587  dimension->AdjustDimensionDetails();
588 
589  preview.Add( dimension );
590  frame()->SetMsgPanel( dimension );
591 
592  m_controls->SetAutoPan( true );
593  m_controls->CaptureCursor( true );
594  }
595  break;
596 
597  case SET_END:
598  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
599 
600  if( !!evt->Modifier( MD_CTRL ) )
601  constrainDimension( dimension );
602 
603  // Dimensions that have origin and end in the same spot are not valid
604  if( dimension->GetOrigin() == dimension->GetEnd() )
605  --step;
606 
607  break;
608 
609  case SET_HEIGHT:
610  {
611  if( wxPoint( cursorPos.x, cursorPos.y ) != dimension->GetPosition() )
612  {
613  assert( dimension->GetOrigin() != dimension->GetEnd() );
614  assert( dimension->GetWidth() > 0 );
615 
616  preview.Remove( dimension );
617 
618  commit.Add( dimension );
619  commit.Push( _( "Draw a dimension" ) );
620  }
621  }
622  break;
623  }
624 
625  if( ++step == FINISHED )
626  {
627  step = SET_ORIGIN;
628  m_controls->SetAutoPan( false );
629  m_controls->CaptureCursor( false );
630  }
631  }
632  else if( evt->IsMotion() )
633  {
634  switch( step )
635  {
636  case SET_END:
637  dimension->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
638 
639  if( !!evt->Modifier( MD_CTRL ) )
640  constrainDimension( dimension );
641 
642  break;
643 
644  case SET_HEIGHT:
645  {
646  // Calculating the direction of travel perpendicular to the selected axis
647  double angle = dimension->GetAngle() + ( M_PI / 2 );
648 
649  wxPoint pos( cursorPos.x, cursorPos.y );
650  wxPoint delta( pos - dimension->m_featureLineDO );
651  double height = ( delta.x * cos( angle ) ) + ( delta.y * sin( angle ) );
652  dimension->SetHeight( height );
653  }
654  break;
655  }
656 
657  // Show a preview of the item
658  m_view->Update( &preview );
659  if( step )
660  frame()->SetMsgPanel( dimension );
661  else
662  frame()->SetMsgPanel( board() );
663  }
664  }
665 
666  if( step != SET_ORIGIN )
667  delete dimension;
668 
669  m_view->Remove( &preview );
670  frame()->SetMsgPanel( board() );
672 
673  return 0;
674 }
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.
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...
virtual void Clear() override
Function Clear() Removes all the stored items from the group.
Definition: selection.h:84
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:276
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:184
int m_PcbTextWidth
current Pcb (not module) Text width
int GetWidth() const
static const unsigned int WIDTH_STEP
Definition: drawing_tool.h:287
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:364
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:212
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:187
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:74
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
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.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Function SetMsgPanel clears the message panel and populates it with the contents of aList...
Definition: draw_frame.cpp:831
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.
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:136
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:281
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:535
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual 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:1499
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:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
void constrainDimension(DIMENSION *dimension)
Function constrainDimension() Forces the dimension lime to be drawn on multiple of 45 degrees...
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.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
const wxPoint GetPosition() const override
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:334
const wxSize & GetTextSize() const
Definition: eda_text.h:213
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:284
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:146
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
BOARD * board() const
Definition: pcb_tool.h:137
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:79
int DRAWING_TOOL::DrawGraphicPolygon ( const TOOL_EVENT aEvent)

Definition at line 707 of file drawing_tool.cpp.

References drawZone(), PCB_BASE_EDIT_FRAME::GetModel(), GRAPHIC_POLYGON, ID_MODEDIT_POLYGON_TOOL, ID_PCB_ADD_POLYGON_BUTT, PCB_TOOL::m_editModules, m_frame, m_mode, and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

708 {
709  if( m_editModules && !m_frame->GetModel() )
710  return 0;
711 
712  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::GRAPHIC_POLYGON );
713 
715  wxCURSOR_PENCIL, _( "Add graphic polygon" ) );
716 
717  return drawZone( false, ZONE_MODE::GRAPHIC_POLYGON );
718 }
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:277
bool m_editModules
Definition: pcb_tool.h:144
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
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 219 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, NULLOPT, BOARD_COMMIT::Push(), S_SEGMENT, EDA_DRAW_FRAME::SetNoToolSelected(), and PCB_BASE_FRAME::SetToolID().

Referenced by setTransitions().

220 {
221  if( m_editModules && !m_frame->GetModel() )
222  return 0;
223 
225  DRAWSEGMENT* line = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
226 
227  OPT<VECTOR2D> startingPoint;
228  BOARD_COMMIT commit( m_frame );
229 
230  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::LINE );
231 
233  wxCURSOR_PENCIL, _( "Add graphic line" ) );
235 
236  while( drawSegment( S_SEGMENT, line, startingPoint ) )
237  {
238  if( line )
239  {
240  commit.Add( line );
241  commit.Push( _( "Draw a line segment" ) );
242  startingPoint = VECTOR2D( line->GetEnd() );
243  }
244  else
245  {
246  startingPoint = NULLOPT;
247  }
248 
249  line = m_editModules ? new EDGE_MODULE( (MODULE*) parent ) : new DRAWSEGMENT;
250  }
251 
253 
254  return 0;
255 }
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, OPT< VECTOR2D > aStartingPoint=NULLOPT)
Starts drawing a selected shape (i.e.
usual segment : line with rounded ends
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.
const auto NULLOPT
Definition: optional.h:9
VECTOR2< double > VECTOR2D
Definition: vector2d.h:588
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:281
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
boost::optional< T > OPT
Definition: optional.h:7
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,
OPT< VECTOR2D aStartingPoint = NULLOPT 
)
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 961 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), SELECTION::Add(), COMMIT::Add(), KIGFX::VIEW::Add(), PCB_TOOL::board(), 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(), PCB_BASE_FRAME::GetScreen(), DRAWSEGMENT::GetStart(), PCB_ACTIONS::incWidth, TOOL_EVT_UTILS::IsCancelInteractive(), PCB_ACTIONS::layerChanged, m_controls, PCB_TOOL::m_editModules, m_frame, m_lineWidth, m_menu, BASE_SCREEN::m_O_Curseur, TOOL_BASE::m_toolMgr, PCB_GENERAL_SETTINGS::m_use45DegreeGraphicSegments, m_view, make45DegLine(), MD_CTRL, BOARD_COMMIT::Push(), SELECTION::Remove(), KIGFX::VIEW::Remove(), PCB_ACTIONS::resetCoords, TOOL_MANAGER::RunAction(), S_CIRCLE, S_SEGMENT, PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), DRAWSEGMENT::SetEnd(), BOARD_ITEM::SetLayer(), EDA_DRAW_FRAME::SetMsgPanel(), 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().

963 {
964  // Only two shapes are currently supported
965  assert( aShape == S_SEGMENT || aShape == S_CIRCLE );
966 
967  DRAWSEGMENT line45;
968 
969  // Add a VIEW_GROUP that serves as a preview for the new item
970  SELECTION preview;
971  m_view->Add( &preview );
972 
974  m_controls->ShowCursor( true );
975  m_controls->SetSnapping( true );
976 
977  Activate();
978 
979  bool direction45 = false; // 45 degrees only mode
980  bool started = false;
981  bool IsOCurseurSet = ( m_frame->GetScreen()->m_O_Curseur != wxPoint( 0, 0 ) );
982  VECTOR2I cursorPos = m_controls->GetCursorPosition();
983 
984  if( aStartingPoint )
985  {
986  // Init the new item attributes
987  aGraphic->SetShape( (STROKE_T) aShape );
988  aGraphic->SetWidth( m_lineWidth );
989  aGraphic->SetStart( wxPoint( aStartingPoint->x, aStartingPoint->y ) );
990  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
991  aGraphic->SetLayer( getDrawingLayer() );
992 
993  if( aShape == S_SEGMENT )
994  line45 = *aGraphic; // used only for direction 45 mode with lines
995 
996  preview.Add( aGraphic );
997  m_controls->SetAutoPan( true );
998  m_controls->CaptureCursor( true );
999 
1000  if( !IsOCurseurSet )
1001  m_frame->GetScreen()->m_O_Curseur = wxPoint( aStartingPoint->x, aStartingPoint->y );
1002 
1003  started = true;
1004  }
1005 
1006  // Main loop: keep receiving events
1007  while( OPT_TOOL_EVENT evt = Wait() )
1008  {
1009  cursorPos = m_controls->GetCursorPosition();
1010 
1011  // 45 degree angle constraint enabled with an option and toggled with Ctrl
1012  const bool limit45 = ( frame()->Settings().m_use45DegreeGraphicSegments != !!( evt->Modifier( MD_CTRL ) ) );
1013 
1014  if( direction45 != limit45 && started && aShape == S_SEGMENT )
1015  {
1016  direction45 = limit45;
1017 
1018  if( direction45 )
1019  {
1020  preview.Add( &line45 );
1021  make45DegLine( aGraphic, &line45 );
1022  }
1023  else
1024  {
1025  preview.Remove( &line45 );
1026  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1027  }
1028 
1029  m_view->Update( &preview );
1030  frame()->SetMsgPanel( aGraphic );
1031  }
1032 
1034  {
1035  preview.Clear();
1036  m_view->Update( &preview );
1037  delete aGraphic;
1038  aGraphic = NULL;
1039  if( !IsOCurseurSet )
1040  m_frame->GetScreen()->m_O_Curseur = wxPoint( 0, 0 );
1041  break;
1042  }
1043  else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) )
1044  {
1045  aGraphic->SetLayer( getDrawingLayer() );
1046  m_view->Update( &preview );
1047  frame()->SetMsgPanel( aGraphic );
1048  }
1049  else if( evt->IsClick( BUT_RIGHT ) )
1050  {
1052  }
1053  else if( evt->IsClick( BUT_LEFT ) || evt->IsDblClick( BUT_LEFT ) )
1054  {
1055  if( !started )
1056  {
1057  // Init the new item attributes
1058  aGraphic->SetShape( (STROKE_T) aShape );
1059  aGraphic->SetWidth( m_lineWidth );
1060  aGraphic->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
1061  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1062  aGraphic->SetLayer( getDrawingLayer() );
1063 
1064  if( !IsOCurseurSet )
1065  m_frame->GetScreen()->m_O_Curseur = wxPoint( cursorPos.x, cursorPos.y );
1066 
1067  if( aShape == S_SEGMENT )
1068  line45 = *aGraphic; // used only for direction 45 mode with lines
1069 
1070  preview.Add( aGraphic );
1071  frame()->SetMsgPanel( aGraphic );
1072  m_controls->SetAutoPan( true );
1073  m_controls->CaptureCursor( true );
1074 
1075  started = true;
1076  }
1077  else
1078  {
1079  if( aGraphic->GetEnd() == aGraphic->GetStart()
1080  || ( evt->IsDblClick( BUT_LEFT ) && aShape == S_SEGMENT ) )
1081  // User has clicked twice in the same spot
1082  {
1083  // a clear sign that the current drawing is finished
1084  // Now we have to add the helper line as well, unless it is zero-length
1085  if( direction45 && line45.GetStart() != aGraphic->GetStart() )
1086  {
1087  BOARD_ITEM_CONTAINER* parent = m_frame->GetModel();
1088  DRAWSEGMENT* l = m_editModules ? new EDGE_MODULE( (MODULE*) parent )
1089  : new DRAWSEGMENT;
1090 
1091  // Copy coordinates, layer, etc.
1092  *static_cast<DRAWSEGMENT*>( l ) = line45;
1093  l->SetEnd( aGraphic->GetStart() );
1094 
1095  BOARD_COMMIT commit( m_frame );
1096  commit.Add( l );
1097  commit.Push( _( "Draw a line" ) );
1098  }
1099 
1100  delete aGraphic;
1101  aGraphic = NULL;
1102  }
1103 
1104  preview.Clear();
1105  break;
1106  }
1107  }
1108  else if( evt->IsMotion() )
1109  {
1110  // 45 degree lines
1111  if( direction45 && aShape == S_SEGMENT )
1112  make45DegLine( aGraphic, &line45 );
1113  else
1114  aGraphic->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1115 
1116  m_view->Update( &preview );
1117 
1118  if( started )
1119  frame()->SetMsgPanel( aGraphic );
1120  else
1121  frame()->SetMsgPanel( board() );
1122  }
1123  else if( evt->IsAction( &PCB_ACTIONS::incWidth ) )
1124  {
1126  aGraphic->SetWidth( m_lineWidth );
1127  line45.SetWidth( m_lineWidth );
1128  m_view->Update( &preview );
1129  frame()->SetMsgPanel( aGraphic );
1130  }
1131  else if( evt->IsAction( &PCB_ACTIONS::decWidth ) && ( m_lineWidth > WIDTH_STEP ) )
1132  {
1134  aGraphic->SetWidth( m_lineWidth );
1135  line45.SetWidth( m_lineWidth );
1136  m_view->Update( &preview );
1137  frame()->SetMsgPanel( aGraphic );
1138  }
1139  else if( evt->IsAction( &PCB_ACTIONS::resetCoords ) )
1140  {
1141  IsOCurseurSet = true;
1142  }
1143  }
1144 
1145  if( !IsOCurseurSet ) // reset the relative coordinte if it was not set before
1146  m_frame->GetScreen()->m_O_Curseur = wxPoint( 0, 0 );
1147 
1148  m_view->Remove( &preview );
1149  frame()->SetMsgPanel( board() );
1150  m_controls->SetAutoPan( false );
1151  m_controls->CaptureCursor( false );
1152 
1153  return started;
1154 }
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:84
static TOOL_ACTION incWidth
Increase width of currently drawn line.
Definition: pcb_actions.h:184
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:287
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:364
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
wxPoint m_O_Curseur
Relative Screen cursor coordinate (on grid) in user units.
Definition: base_screen.h:185
static TOOL_ACTION resetCoords
Definition: pcb_actions.h:380
static TOOL_ACTION decWidth
Decrease width of currently drawn line.
Definition: pcb_actions.h:187
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:74
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
static bool m_use45DegreeGraphicSegments
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Function SetMsgPanel clears the message panel and populates it with the contents of aList...
Definition: draw_frame.cpp:831
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:136
unsigned int m_lineWidth
Stores the current line width for multisegment drawing.
Definition: drawing_tool.h:281
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:275
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual 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:1499
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:277
bool m_editModules
Definition: pcb_tool.h:144
PCB_LAYER_ID getDrawingLayer() const
Selects a non-copper layer for drawing
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:283
PCB_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
void SetEnd(const wxPoint &aEnd)
void Activate()
Function Activate() Runs the tool.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Function GetModel()
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:334
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:284
void make45DegLine(DRAWSEGMENT *aSegment, DRAWSEGMENT *aHelper) const
Function make45DegLine() Forces a DRAWSEGMENT to be drawn at multiple of 45 degrees.
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
BOARD * board() const
Definition: pcb_tool.h:137
void SetWidth(int aWidth)
virtual void Remove(EDA_ITEM *aItem)
Definition: selection.h:79
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 721 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().

722 {
723  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
724 
725  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add similar zone" ) );
726 
727  return drawZone( false, ZONE_MODE::SIMILAR );
728 }
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:277
int DRAWING_TOOL::DrawVia ( const TOOL_EVENT aEvent)

Definition at line 1486 of file drawing_tool.cpp.

References COMMIT::Add(), GRID_HELPER::AlignToSegment(), B_Cu, TRACK::Clone(), PCB_TOOL::doInteractiveItemPlacement(), F_Cu, PCB_TOOL::frame(), PCB_BASE_FRAME::GetActiveLayer(), BOARD::GetCopperLayerCount(), BOARD::GetDesignSettings(), TRACK::GetEnd(), ZONE_CONTAINER::GetLayer(), VIA::GetLayerSet(), NETINFO_ITEM::GetMicroViaDrillSize(), NETINFO_ITEM::GetMicroViaSize(), BOARD_CONNECTED_ITEM::GetNet(), BOARD_CONNECTED_ITEM::GetNetCode(), VIA::GetPosition(), PCB_BASE_FRAME::GetScreen(), TRACK::GetStart(), VIA::GetViaType(), TRACK::GetWidth(), 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, MD_SHIFT, mod, COMMIT::Modify(), BOARD::Modules(), VIA::SetDrill(), TRACK::SetEnd(), VIA::SetLayerPair(), BOARD_CONNECTED_ITEM::SetNetCode(), BOARD_ITEM::SetPosition(), TRACK::SetStart(), PCB_BASE_FRAME::SetToolID(), VIA::SetViaType(), TRACK::SetWidth(), TestSegmentHit(), ToLAYER_ID(), BOARD::Tracks(), VIA, VIA_BLIND_BURIED, VIA_MICROVIA, and BOARD::Zones().

Referenced by setTransitions().

1487 {
1488  struct VIA_PLACER : public INTERACTIVE_PLACER_BASE
1489  {
1490  GRID_HELPER m_gridHelper;
1491 
1492  VIA_PLACER( PCB_EDIT_FRAME* aFrame ) : m_gridHelper( aFrame )
1493  {}
1494 
1495  TRACK* findTrack( VIA* aVia )
1496  {
1497  const LSET lset = aVia->GetLayerSet();
1498 
1499  for( TRACK* track : m_board->Tracks() )
1500  {
1501  if( !(track->GetLayerSet() & lset ).any() )
1502  continue;
1503 
1504  if( TestSegmentHit( aVia->GetPosition(), track->GetStart(), track->GetEnd(),
1505  ( track->GetWidth() + aVia->GetWidth() ) / 2 ) )
1506  return track;
1507  }
1508 
1509  return nullptr;
1510  }
1511 
1512  int findStitchedZoneNet( VIA* aVia )
1513  {
1514  const auto pos = aVia->GetPosition();
1515  const auto lset = aVia->GetLayerSet();
1516 
1517  for( auto mod : m_board->Modules() )
1518  {
1519  for( D_PAD* pad : mod->Pads() )
1520  {
1521  if( pad->HitTest( pos ) && ( pad->GetLayerSet() & lset ).any() )
1522  return -1;
1523  }
1524  }
1525 
1526  std::vector<ZONE_CONTAINER*> foundZones;
1527 
1528  for( auto zone : m_board->Zones() )
1529  {
1530  if( zone->HitTestFilledArea( pos ) )
1531  {
1532  foundZones.push_back( zone );
1533  }
1534  }
1535 
1536  std::sort( foundZones.begin(), foundZones.end(),
1537  [] ( const ZONE_CONTAINER* a, const ZONE_CONTAINER* b ) {
1538  return a->GetLayer() < b->GetLayer();
1539  } );
1540 
1541  // first take the net of the active layer
1542  for( auto z : foundZones )
1543  {
1544  if( m_frame->GetActiveLayer() == z->GetLayer() )
1545  return z->GetNetCode();
1546  }
1547 
1548  // none? take the topmost visible layer
1549  for( auto z : foundZones )
1550  {
1551  if( m_board->IsLayerVisible( z->GetLayer() ) )
1552  return z->GetNetCode();
1553  }
1554 
1555  return -1;
1556  }
1557 
1558  void SnapItem( BOARD_ITEM *aItem ) override
1559  {
1560  // If you place a Via on a track but not on its centerline, the current
1561  // connectivity algorithm will require us to put a kink in the track when
1562  // we break it (so that each of the two segments ends on the via center).
1563  // That's not ideal, and is in fact probably worse than forcing snap in
1564  // this situation.
1565 
1566 // bool do_snap = ( m_frame->Settings().m_magneticTracks == CAPTURE_CURSOR_IN_TRACK_TOOL
1567 // || m_frame->Settings().m_magneticTracks == CAPTURE_ALWAYS );
1568  bool do_snap = true;
1569 
1570  if( m_modifiers & MD_SHIFT )
1571  do_snap = !do_snap;
1572 
1573  if( do_snap )
1574  {
1575  auto via = static_cast<VIA*>( aItem );
1576  wxPoint pos = via->GetPosition();
1577  TRACK* track = findTrack( via );
1578 
1579  if( track )
1580  {
1581  SEG trackSeg( track->GetStart(), track->GetEnd() );
1582  VECTOR2I snap = m_gridHelper.AlignToSegment( pos, trackSeg );
1583 
1584  aItem->SetPosition( wxPoint( snap.x, snap.y ) );
1585  }
1586  }
1587  }
1588 
1589  void PlaceItem( BOARD_ITEM* aItem, BOARD_COMMIT& aCommit ) override
1590  {
1591  auto via = static_cast<VIA*>( aItem );
1592  int newNet;
1593  TRACK* track = findTrack( via );
1594 
1595  if( track )
1596  {
1597  aCommit.Modify( track );
1598  TRACK* newTrack = dynamic_cast<TRACK*>( track->Clone() );
1599  track->SetEnd( via->GetPosition() );
1600  newTrack->SetStart( via->GetPosition() );
1601  aCommit.Add( newTrack );
1602 
1603  newNet = track->GetNetCode();
1604  }
1605  else
1606  newNet = findStitchedZoneNet( via );
1607 
1608  if( newNet > 0 )
1609  via->SetNetCode( newNet );
1610 
1611  aCommit.Add( aItem );
1612  }
1613 
1614  std::unique_ptr<BOARD_ITEM> CreateItem() override
1615  {
1616  auto& ds = m_board->GetDesignSettings();
1617  VIA* via = new VIA( m_board );
1618 
1619  via->SetNetCode( 0 );
1620  via->SetViaType( ds.m_CurrentViaType );
1621 
1622  // for microvias, the size and hole will be changed later.
1623  via->SetWidth( ds.GetCurrentViaSize() );
1624  via->SetDrill( ds.GetCurrentViaDrill() );
1625 
1626  // Usual via is from copper to component.
1627  // layer pair is B_Cu and F_Cu.
1628  via->SetLayerPair( B_Cu, F_Cu );
1629 
1630  PCB_LAYER_ID first_layer = m_frame->GetActiveLayer();
1631  PCB_LAYER_ID last_layer;
1632 
1633  // prepare switch to new active layer:
1634  if( first_layer != m_frame->GetScreen()->m_Route_Layer_TOP )
1635  last_layer = m_frame->GetScreen()->m_Route_Layer_TOP;
1636  else
1637  last_layer = m_frame->GetScreen()->m_Route_Layer_BOTTOM;
1638 
1639  // Adjust the actual via layer pair
1640  switch( via->GetViaType() )
1641  {
1642  case VIA_BLIND_BURIED:
1643  via->SetLayerPair( first_layer, last_layer );
1644  break;
1645 
1646  case VIA_MICROVIA: // from external to the near neighbor inner layer
1647  {
1648  PCB_LAYER_ID last_inner_layer =
1649  ToLAYER_ID( ( m_board->GetCopperLayerCount() - 2 ) );
1650 
1651  if( first_layer == B_Cu )
1652  last_layer = last_inner_layer;
1653  else if( first_layer == F_Cu )
1654  last_layer = In1_Cu;
1655  else if( first_layer == last_inner_layer )
1656  last_layer = B_Cu;
1657  else if( first_layer == In1_Cu )
1658  last_layer = F_Cu;
1659 
1660  // else error: will be removed later
1661  via->SetLayerPair( first_layer, last_layer );
1662 
1663  // Update diameter and hole size, which where set previously
1664  // for normal vias
1665  NETINFO_ITEM* net = via->GetNet();
1666 
1667  if( net )
1668  {
1669  via->SetWidth( net->GetMicroViaSize() );
1670  via->SetDrill( net->GetMicroViaDrillSize() );
1671  }
1672  }
1673  break;
1674 
1675  default:
1676  break;
1677  }
1678 
1679  return std::unique_ptr<BOARD_ITEM>( via );
1680  }
1681  };
1682 
1683  VIA_PLACER placer( frame() );
1684 
1685  frame()->SetToolID( ID_PCB_DRAW_VIA_BUTT, wxCURSOR_PENCIL, _( "Add vias" ) );
1686 
1687  doInteractiveItemPlacement( &placer, _( "Place via" ),
1689 
1690  frame()->SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString );
1691 
1692  return 0;
1693 }
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
COMMIT & Modify(EDA_ITEM *aItem)
Modifies a given item in the model.
Definition: commit.h:103
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:276
void SetViaType(VIATYPE_T aViaType)
Definition: class_track.h:461
virtual void SetPosition(const wxPoint &aPos)=0
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
void SetEnd(const wxPoint &aEnd)
Definition: class_track.h:118
COMMIT & Add(EDA_ITEM *aItem)
Adds a new item to the model
Definition: commit.h:78
int GetCopperLayerCount() const
Function GetCopperLayerCount.
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:175
VECTOR2I AlignToSegment(const VECTOR2I &aPoint, const SEG &aSeg)
virtual EDA_ITEM * Clone() const override
Function Clone creates a duplicate of this item with linked list members set to NULL.
const wxPoint & GetEnd() const
Definition: class_track.h:119
void SetWidth(int aWidth)
Definition: class_track.h:115
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
DLIST_ITERATOR_WRAPPER< MODULE > Modules()
Definition: class_board.h:253
VIATYPE_T GetViaType() const
Definition: class_track.h:460
const wxPoint & GetStart() const
Definition: class_track.h:122
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:136
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:535
PCB_LAYER_ID m_Route_Layer_BOTTOM
Definition: pcb_screen.h:46
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...
const wxPoint GetPosition() const override
Definition: class_track.h:432
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
int GetNetCode() const
Function GetNetCode.
Definition: seg.h:36
Class NETINFO_ITEM handles the data for a net.
Definition: netinfo.h:69
ZONE_CONTAINERS & Zones()
Definition: class_board.h:255
int GetWidth() const
Definition: class_track.h:116
void SetDrill(int aDrill)
Function SetDrill sets the drill value for vias.
Definition: class_track.h:468
Class PCB_EDIT_FRAME is the main frame for Pcbnew.
PCB_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
int GetMicroViaDrillSize()
Function GetViaDrillSize returns the size of via drills used to route this net.
Definition: netinfo.h:182
void SetStart(const wxPoint &aStart)
Definition: class_track.h:121
DLIST_ITERATOR_WRAPPER< TRACK > Tracks()
Definition: class_board.h:252
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:39
bool TestSegmentHit(const wxPoint &aRefPoint, wxPoint aStart, wxPoint aEnd, int aDist)
Function TestSegmentHit test for hit on line segment i.e.
Definition: trigo.cpp:122
int GetMicroViaSize()
Function GetMicroViaSize returns the size of vias used to route this net.
Definition: netinfo.h:162
virtual PCB_LAYER_ID GetActiveLayer() const
Function GetActiveLayer returns the active layer.
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:796
#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
Definition: pcb_screen.h:45
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:454
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 677 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().

678 {
679  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
680 
681  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add zones" ) );
682 
683  return drawZone( false, ZONE_MODE::ADD );
684 }
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:277
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 1425 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 DrawGraphicPolygon(), DrawSimilarZone(), DrawZone(), DrawZoneCutout(), and DrawZoneKeepout().

1426 {
1427  // get a source zone, if we need one. We need it for:
1428  // ZONE_MODE::CUTOUT (adding a hole to the source zone)
1429  // ZONE_MODE::SIMILAR (creating a new zone using settings of source zone
1430  ZONE_CONTAINER* sourceZone = nullptr;
1431 
1432  if( !getSourceZoneForAction( aMode, sourceZone ) )
1433  return 0;
1434 
1436 
1437  params.m_keepout = aKeepout;
1438  params.m_mode = aMode;
1439  params.m_sourceZone = sourceZone;
1440 
1441  ZONE_CREATE_HELPER zoneTool( *this, params );
1442 
1443  // the geometry manager which handles the zone geometry, and
1444  // hands the calculated points over to the zone creator tool
1445  POLYGON_GEOM_MANAGER polyGeomMgr( zoneTool );
1446 
1447  Activate(); // register for events
1448 
1449  auto& controls = *getViewControls();
1450 
1452 
1453  controls.ShowCursor( true );
1454  controls.SetSnapping( true );
1455 
1456  runPolygonEventLoop( polyGeomMgr );
1457 
1459 
1460  return 0;
1461 }
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:60
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
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:135
ZONE_CONTAINER * m_sourceZone
Zone settings source (for similar and cutout zones)
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:41
DRAWING_TOOL::ZONE_MODE m_mode
The zone mode to operate in
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
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 697 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().

698 {
699  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ZONE );
700 
701  m_frame->SetToolID( ID_PCB_ZONES_BUTT, wxCURSOR_PENCIL, _( "Add zone cutout" ) );
702 
703  return drawZone( false, ZONE_MODE::CUTOUT );
704 }
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:277
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 687 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().

688 {
689  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::KEEPOUT );
690 
691  m_frame->SetToolID( ID_PCB_KEEPOUT_AREA_BUTT, wxCURSOR_PENCIL, _( "Add keepout" ) );
692 
693  return drawZone( true, ZONE_MODE::ADD );
694 }
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:277
Add a new zone/keepout with fresh settings.
bool PCB_TOOL::EditingModules ( ) const
inlineinherited

Definition at line 99 of file pcb_tool.h.

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

100  {
101  return m_editModules;
102  }
bool m_editModules
Definition: pcb_tool.h:144
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 136 of file pcb_tool.h.

Referenced by POINT_EDITOR::addCorner(), MICROWAVE_TOOL::addMicrowaveFootprint(), PAD_TOOL::applyPadSettings(), PCB_TOOL::canvas(), EDIT_TOOL::changeTrackWidthOnClick(), PNS::TOOL_BASE::checkSnap(), PAD_TOOL::copyPadSettings(), EDIT_TOOL::copyToClipboard(), MICROWAVE_TOOL::createInductorBetween(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), ROUTER_TOOL::CustomTrackWidthDialog(), PCB_TOOL::displayOptions(), PCB_TOOL::doInteractiveItemPlacement(), ROUTER_TOOL::DpDimensionsDialog(), drawArc(), DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), drawSegment(), DrawVia(), MODULE_EDITOR_TOOLS::EnumeratePads(), EDIT_TOOL::ExchangeFootprints(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), ROUTER_TOOL::finishInteractive(), getMicrowaveItemCreator(), highlightNet(), PICKER_TOOL::Init(), PAD_TOOL::Init(), EDIT_TOOL::Init(), SELECTION_TOOL::Init(), ROUTER_TOOL::InlineDrag(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), LENGTH_TUNER_TOOL::meanderSettingsDialog(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), ROUTER_TOOL::onViaCommand(), PCBNEW_CONTROL::PasteItemsFromClipboard(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), MODULE_EDITOR_TOOLS::PlacePad(), PlaceText(), ROUTER_TOOL::prepareInteractive(), PAD_TOOL::pushPadSettings(), POINT_EDITOR::removeCorner(), PNS::TOOL_BASE::Reset(), ROUTER_TOOL::RouteDiffPair(), ROUTER_TOOL::RouteSingleTrace(), ROUTER_TOOL::SettingsDialog(), ROUTER_TOOL::switchLayerOnViaPlacement(), LENGTH_TUNER_TOOL::TuneDiffPair(), LENGTH_TUNER_TOOL::TuneDiffPairSkew(), LENGTH_TUNER_TOOL::TuneSingleTrace(), POINT_EDITOR::updateItem(), ZONE_FILLER_TOOL::ZoneFill(), and ZONE_FILLER_TOOL::ZoneFillAll().

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

Selects a non-copper layer for drawing

Definition at line 1727 of file drawing_tool.cpp.

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

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

1728 {
1729  PCB_LAYER_ID layer = m_frame->GetActiveLayer();
1730 
1731  if( IsCopperLayer( layer ) )
1732  {
1733  if( layer == F_Cu )
1734  layer = F_SilkS;
1735  else if( layer == B_Cu )
1736  layer = B_SilkS;
1737  else
1738  layer = Dwgs_User;
1739 
1740  m_frame->SetActiveLayer( layer );
1741  }
1742 
1743  return layer;
1744 }
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:277
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 213 of file drawing_tool.cpp.

References m_mode.

Referenced by PCB_EDITOR_CONTROL::Init().

214 {
215  return m_mode;
216 }
template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Function getEditFrame()

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

Definition at line 188 of file tool_base.h.

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

189  {
190  return static_cast<T*>( getEditFrameInt() );
191  }
wxWindow * getEditFrameInt() const
Definition: tool_base.cpp:47
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.

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

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:210
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.

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:215
template<typename T >
T* TOOL_BASE::getModel ( ) const
inlineprotectedinherited

Function getModel()

Returns the model object if it matches the requested type.

Definition at line 199 of file tool_base.h.

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

200  {
201  EDA_ITEM* m = getModelInt();
202 
203  return static_cast<T*>( m );
204  }
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:162
EDA_ITEM * getModelInt() const
Definition: tool_base.cpp:53
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.

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:214
int DRAWING_TOOL::getSegmentWidth ( unsigned int  aLayer) const
private

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

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

1715 {
1716  assert( m_board );
1717 
1718  if( aLayer == Edge_Cuts )
1720  else if( m_editModules )
1722  else
1724 }
BOARD * m_board
Definition: drawing_tool.h:276
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:535
bool m_editModules
Definition: pcb_tool.h:144
int m_EdgeSegmentWidth
current graphic line width (EDGE layer only)
TOOL_SETTINGS & TOOL_BASE::GetSettings ( )
inherited

Definition at line 77 of file tool_base.cpp.

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

78 {
79  return m_toolSettings;
80 }
TOOL_SETTINGS m_toolSettings
Definition: tool_base.h:216
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 1293 of file drawing_tool.cpp.

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

Referenced by drawZone().

1294 {
1295  aZone = nullptr;
1296 
1297  // not an action that needs a source zone
1298  if( aMode == ZONE_MODE::ADD || aMode == ZONE_MODE::GRAPHIC_POLYGON )
1299  return true;
1300 
1302  const SELECTION& selection = selTool->GetSelection();
1303 
1304  if( selection.Empty() )
1306 
1307  // we want a single zone
1308  if( selection.Size() != 1 )
1309  return false;
1310 
1311  aZone = dyn_cast<ZONE_CONTAINER*>( selection[0] );
1312 
1313  // expected a zone, but didn't get one
1314  if( !aZone )
1315  return false;
1316 
1317  return true;
1318 }
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
Class SELECTION_TOOL.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
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:61
SELECTION & GetSelection()
Function GetSelection()
const SELECTION & selection() const
Definition: pcb_tool.cpp:221
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.

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:284
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.

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:207
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 35 of file tool_base.cpp.

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

Referenced by ALIGN_DISTRIBUTE_TOOL::AlignLeft(), ALIGN_DISTRIBUTE_TOOL::AlignRight(), PCB_EDITOR_CONTROL::CrossProbeSchToPcb(), PCBNEW_CONTROL::CursorControl(), GERBVIEW_SELECTION_TOOL::disambiguationMenu(), SELECTION_TOOL::disambiguationMenu(), MICROWAVE_TOOL::drawMicrowaveInductor(), PCB_EDITOR_CONTROL::DrillOrigin(), MODULE_EDITOR_TOOLS::EnumeratePads(), SELECTION_TOOL::findCallback(), ROUTER_TOOL::getStartLayer(), PCBNEW_CONTROL::GridResetOrigin(), PCBNEW_CONTROL::GridSetOrigin(), SELECTION_TOOL::guessSelectionCandidates(), GERBVIEW_CONTROL::HighlightControl(), PNS::TOOL_BASE::highlightNet(), PCBNEW_CONTROL::LayerAlphaDec(), PCBNEW_CONTROL::LayerAlphaInc(), GERBVIEW_SELECTION_TOOL::MeasureTool(), EDIT_TOOL::MeasureTool(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), PCBNEW_CONTROL::PanControl(), PNS::TOOL_BASE::pickSingleItem(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PCB_EDITOR_CONTROL::Reset(), PNS::TOOL_BASE::Reset(), PCBNEW_CONTROL::Reset(), Reset(), GERBVIEW_SELECTION_TOOL::Reset(), SELECTION_TOOL::Reset(), GERBVIEW_SELECTION_TOOL::select(), GERBVIEW_SELECTION_TOOL::selectable(), SELECTION_TOOL::selectable(), GERBVIEW_SELECTION_TOOL::selectionContains(), SELECTION_TOOL::selectionContains(), GERBVIEW_SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectMultiple(), ZOOM_TOOL::selectRegion(), GERBVIEW_SELECTION_TOOL::selectVisually(), GERBVIEW_SELECTION_TOOL::unselect(), GERBVIEW_SELECTION_TOOL::unselectVisually(), POINT_EDITOR::updateEditedPoint(), COMMON_TOOLS::updateGrid(), PCBNEW_CONTROL::updateGrid(), POINT_EDITOR::updatePoints(), SELECTION_TOOL::updateSelection(), PNS::TOOL_BASE::updateStartItem(), COMMON_TOOLS::ZoomFitScreen(), GERBVIEW_SELECTION_TOOL::zoomFitSelection(), SELECTION_TOOL::zoomFitSelection(), GERBVIEW_SELECTION_TOOL::~GERBVIEW_SELECTION_TOOL(), and SELECTION_TOOL::~SELECTION_TOOL().

36 {
37  return m_toolMgr->GetView();
38 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
KIGFX::VIEW_CONTROLS * TOOL_BASE::getViewControls ( ) const
protectedinherited

Function getViewControls()

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

Returns
The instance of VIEW_CONTROLS.

Definition at line 41 of file tool_base.cpp.

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

Referenced by POINT_EDITOR::addCorner(), PCBNEW_CONTROL::CursorControl(), COMMON_TOOLS::doZoomToPreset(), MICROWAVE_TOOL::drawMicrowaveInductor(), drawZone(), MODULE_EDITOR_TOOLS::EnumeratePads(), SELECTION_TOOL::findMove(), PCB_EDITOR_CONTROL::HighlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), PICKER_TOOL::Main(), EDIT_TOOL::Main(), GERBVIEW_SELECTION_TOOL::Main(), ROUTER_TOOL::mainLoop(), GERBVIEW_SELECTION_TOOL::MeasureTool(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), ROUTER_TOOL::performDragging(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), POINT_EDITOR::Reset(), Reset(), GERBVIEW_CONTROL::ResetCoords(), PCBNEW_CONTROL::ResetCoords(), runPolygonEventLoop(), GERBVIEW_SELECTION_TOOL::selectCursor(), SELECTION_TOOL::selectCursor(), GERBVIEW_SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectMultiple(), ZOOM_TOOL::selectRegion(), PICKER_TOOL::setControls(), POINT_EDITOR::setEditedPoint(), EDIT_TOOL::updateModificationPoint(), and COMMON_TOOLS::ZoomCenter().

42 {
43  return m_toolMgr->GetViewControls();
44 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
KIGFX::VIEW_CONTROLS * GetViewControls() const
Definition: tool_manager.h:257
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(), PAD_TOOL::setTransitions(), MICROWAVE_TOOL::setTransitions(), ZONE_FILLER_TOOL::setTransitions(), POINT_EDITOR::setTransitions(), COMMON_TOOLS::setTransitions(), GERBVIEW_CONTROL::setTransitions(), MODULE_EDITOR_TOOLS::setTransitions(), POSITION_RELATIVE_TOOL::setTransitions(), ALIGN_DISTRIBUTE_TOOL::setTransitions(), PCBNEW_CONTROL::setTransitions(), PICKER_TOOL::setTransitions(), GERBVIEW_SELECTION_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 166 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.

167 {
168  auto activeToolFunctor = [ this ] ( const SELECTION& aSel ) {
169  return m_mode != MODE::NONE;
170  };
171 
172  // some interactive drawing tools can undo the last point
173  auto canUndoPoint = [ this ] ( const SELECTION& aSel ) {
174  return m_mode == MODE::ARC || m_mode == MODE::ZONE;
175  };
176 
177  // functor for zone-only actions
178  auto zoneActiveFunctor = [this ] ( const SELECTION& aSel ) {
179  return m_mode == MODE::ZONE;
180  };
181 
182  auto& ctxMenu = m_menu.GetMenu();
183 
184  // cancel current toool goes in main context menu at the top if present
185  ctxMenu.AddItem( ACTIONS::cancelInteractive, activeToolFunctor, 1000 );
186 
187  // tool-specific actions
188  ctxMenu.AddItem( closeZoneOutline, zoneActiveFunctor, 1000 );
189  ctxMenu.AddItem( deleteLastPoint, canUndoPoint, 1000 );
190 
191  ctxMenu.AddSeparator( activeToolFunctor, 1000 );
192 
193  // Type-specific sub-menus will be added for us by other tools
194  // For example, zone fill/unfill is provided by the PCB control tool
195 
196  // Finally, add the standard zoom/grid items
197  m_menu.AddStandardSubMenus( *getEditFrame<PCB_BASE_FRAME>() );
198 
199  return true;
200 }
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:284
bool TOOL_BASE::IsToolActive ( ) const
inherited

Definition at line 30 of file tool_base.cpp.

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

31 {
32  return m_toolMgr->IsToolActive( m_toolId );
33 }
bool IsToolActive(TOOL_ID aId) const
Function IsToolActive() Returns true if a tool with given id is active (executing) ...
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
TOOL_ID m_toolId
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:210
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 1464 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().

1465 {
1466  VECTOR2I cursorPos = m_controls->GetCursorPosition();
1467  VECTOR2I origin( aSegment->GetStart() );
1468  DIRECTION_45 direction( origin - cursorPos );
1469  SHAPE_LINE_CHAIN newChain = direction.BuildInitialTrace( origin, cursorPos );
1470 
1471  if( newChain.PointCount() > 2 )
1472  {
1473  aSegment->SetEnd( wxPoint( newChain.Point( -2 ).x, newChain.Point( -2 ).y ) );
1474  aHelper->SetStart( wxPoint( newChain.Point( -2 ).x, newChain.Point( -2 ).y ) );
1475  aHelper->SetEnd( wxPoint( newChain.Point( -1 ).x, newChain.Point( -1 ).y ) );
1476  }
1477  else
1478  {
1479  aSegment->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1480  aHelper->SetStart( wxPoint( cursorPos.x, cursorPos.y ) );
1481  aHelper->SetEnd( wxPoint( cursorPos.x, cursorPos.y ) );
1482  }
1483 }
int PointCount() const
Function PointCount()
Class DIRECTION_45.
Definition: direction45.h:36
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
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 731 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, 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::GetPolyShape(), 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(), EDGE_MODULE::SetLocalCoord(), TEXTE_MODULE::SetLocalCoord(), EDA_TEXT::SetMirrored(), EDA_TEXT::SetMultilineAllowed(), DRAWSEGMENT::SetPolyShape(), 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().

732 {
733  if( !m_frame->GetModel() )
734  return 0;
735 
736  DIALOG_DXF_IMPORT dlg( m_frame );
737  int dlgResult = dlg.ShowModal();
738 
739  const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems();
740 
741  if( dlgResult != wxID_OK || list.empty() )
742  return 0;
743 
744  VECTOR2I cursorPos = m_controls->GetCursorPosition();
745  VECTOR2I delta = cursorPos - list.front()->GetPosition();
746 
747  // Add a VIEW_GROUP that serves as a preview for the new item
748  SELECTION preview;
749  BOARD_COMMIT commit( m_frame );
750 
751  // Build the undo list & add items to the current view
752  for( auto item : list )
753  {
754  assert( item->Type() == PCB_LINE_T || item->Type() == PCB_TEXT_T );
755  preview.Add( item );
756  }
757 
758  BOARD_ITEM* firstItem = static_cast<BOARD_ITEM*>( preview.Front() );
759  m_view->Add( &preview );
760 
762  m_controls->ShowCursor( true );
763  m_controls->SetSnapping( true );
764 
765  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DXF );
766 
767  Activate();
768 
769  // Main loop: keep receiving events
770  while( OPT_TOOL_EVENT evt = Wait() )
771  {
772  cursorPos = m_controls->GetCursorPosition();
773 
774  if( evt->IsMotion() )
775  {
776  delta = cursorPos - firstItem->GetPosition();
777 
778  for( auto item : preview )
779  static_cast<BOARD_ITEM*>( item )->Move( wxPoint( delta.x, delta.y ) );
780 
781  m_view->Update( &preview );
782  }
783  else if( evt->Category() == TC_COMMAND )
784  {
785  // TODO it should be handled by EDIT_TOOL, so add items and select?
786  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) )
787  {
788  const auto rotationPoint = wxPoint( cursorPos.x, cursorPos.y );
789  const auto rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle(
790  *m_frame, *evt );
791 
792  for( auto item : preview )
793  {
794  static_cast<BOARD_ITEM*>( item )->Rotate( rotationPoint, rotationAngle );
795  }
796 
797  m_view->Update( &preview );
798  }
799  else if( evt->IsAction( &PCB_ACTIONS::flip ) )
800  {
801  for( auto item : preview )
802  static_cast<BOARD_ITEM*>( item )->Flip( wxPoint( cursorPos.x, cursorPos.y ) );
803 
804  m_view->Update( &preview );
805  }
806  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
807  {
808  preview.FreeItems();
809  break;
810  }
811  }
812  else if( evt->IsClick( BUT_RIGHT ) )
813  {
815  }
816  else if( evt->IsClick( BUT_LEFT ) )
817  {
818  // Place the drawing
820 
821  for( auto item : preview )
822  {
823  if( m_editModules )
824  {
825  // Modules use different types for the same things,
826  // so we need to convert imported items to appropriate classes.
827  BOARD_ITEM* converted = NULL;
828 
829  switch( item->Type() )
830  {
831  case PCB_TEXT_T:
832  {
833  TEXTE_PCB* text = static_cast<TEXTE_PCB*>( item );
834  TEXTE_MODULE* textMod = new TEXTE_MODULE( (MODULE*) parent );
835 
836  // Assignment operator also copies the item PCB_TEXT_T type,
837  // so it cannot be added to a module which handles PCB_MODULE_TEXT_T
838  textMod->SetText( text->GetText() );
839 #if 0
840  textMod->SetTextSize( text->GetTextSize() );
841  textMod->SetThickness( text->GetThickness() );
842  textMod->SetOrientation( text->GetTextAngle() );
843  textMod->SetTextPos( text->GetTextPos() );
844  textMod->SetTextSize( text->GetTextSize() );
845  textMod->SetVisible( text->GetVisible() );
846  textMod->SetMirrored( text->IsMirrored() );
847  textMod->SetItalic( text->IsItalic() );
848  textMod->SetBold( text->IsBold() );
849  textMod->SetHorizJustify( text->GetHorizJustify() );
850  textMod->SetVertJustify( text->GetVertJustify() );
851  textMod->SetMultilineAllowed( text->IsMultilineAllowed() );
852 #else
853  textMod->EDA_TEXT::SetEffects( *text );
854  textMod->SetLocalCoord(); // using changed SetTexPos() via SetEffects()
855 #endif
856  converted = textMod;
857  break;
858  }
859 
860  case PCB_LINE_T:
861  {
862  DRAWSEGMENT* seg = static_cast<DRAWSEGMENT*>( item );
863  EDGE_MODULE* modSeg = new EDGE_MODULE( (MODULE*) parent );
864 
865  // Assignment operator also copies the item PCB_LINE_T type,
866  // so it cannot be added to a module which handles PCB_MODULE_EDGE_T
867  modSeg->SetWidth( seg->GetWidth() );
868  modSeg->SetStart( seg->GetStart() );
869  modSeg->SetEnd( seg->GetEnd() );
870  modSeg->SetAngle( seg->GetAngle() );
871  modSeg->SetShape( seg->GetShape() );
872  modSeg->SetType( seg->GetType() );
873  modSeg->SetBezControl1( seg->GetBezControl1() );
874  modSeg->SetBezControl2( seg->GetBezControl2() );
875  modSeg->SetBezierPoints( seg->GetBezierPoints() );
876  modSeg->SetPolyShape( seg->GetPolyShape() );
877  modSeg->SetLocalCoord();
878  converted = modSeg;
879  break;
880  }
881 
882  default:
883  assert( false );
884  break;
885  }
886 
887  if( converted )
888  converted->SetLayer( static_cast<BOARD_ITEM*>( item )->GetLayer() );
889 
890  delete item;
891  item = converted;
892  }
893 
894  if( item )
895  commit.Add( item );
896  }
897 
898  commit.Push( _( "Place a DXF drawing" ) );
899  break;
900  }
901  }
902 
903  preview.Clear();
904  m_view->Remove( &preview );
905 
906  return 0;
907 }
void SetMirrored(bool isMirrored)
Definition: eda_text.h:176
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
void SetPolyShape(const SHAPE_POLY_SET &aShape)
bool IsMultilineAllowed() const
Definition: eda_text.h:186
void SetBezierPoints(const std::vector< wxPoint > &aPoints)
const wxPoint & GetTextPos() const
Definition: eda_text.h:222
bool IsItalic() const
Definition: eda_text.h:168
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:167
EDA_ITEM * Front() const
Definition: selection.h:147
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:364
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:221
void SetVisible(bool aVisible)
Definition: eda_text.h:173
OPT_TOOL_EVENT Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
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:212
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:188
void SetBezControl2(const wxPoint &aPoint)
static const int delta[8][2]
Definition: solve.cpp:112
bool IsBold() const
Definition: eda_text.h:171
double GetTextAngle() const
Definition: eda_text.h:162
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:152
virtual void Add(EDA_ITEM *aItem)
Definition: selection.h:74
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
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:128
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
void SetVertJustify(EDA_TEXT_VJUSTIFY_T aType)
Definition: eda_text.h:192
const wxPoint & GetBezControl1() const
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
SHAPE_POLY_SET & GetPolyShape()
int GetType() const
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual 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:1499
void SetMultilineAllowed(bool aAllow)
Function SetMultiLineAllowed.
Definition: eda_text.h:185
void SetStart(const wxPoint &aStart)
virtual const wxPoint GetPosition() const =0
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
bool m_editModules
Definition: pcb_tool.h:144
const std::vector< wxPoint > & GetBezierPoints() const
void SetLocalCoord()
Set relative coordinates from draw coordinates.
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:189
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:102
void SetLocalCoord()
Set relative coordinates.
double GetAngle() const
void SetHorizJustify(EDA_TEXT_HJUSTIFY_T aType)
Definition: eda_text.h:191
bool IsMirrored() const
Definition: eda_text.h:177
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()
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:334
const wxSize & GetTextSize() const
Definition: eda_text.h:213
Abstract interface for BOARD_ITEMs capable of storing other items inside.
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
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:170
void Flip(T &aValue)
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:284
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:146
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
void SetBezControl1(const wxPoint &aPoint)
virtual void SetText(const wxString &aText)
Definition: eda_text.h:139
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 322 of file drawing_tool.cpp.

References TOOL_INTERACTIVE::Activate(), COMMIT::Add(), PCB_TOOL::board(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), EDA_ITEM::ClearFlags(), PCB_TOOL::frame(), PCB_BASE_FRAME::GetActiveLayer(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), PCB_BASE_FRAME::GetDesignSettings(), PCB_BASE_EDIT_FRAME::GetModel(), SELECTION_TOOL::GetSelection(), EDA_TEXT::GetText(), TOOL_MANAGER::GetTool(), ID_MODEDIT_TEXT_TOOL, ID_PCB_ADD_TEXT_BUTT, IS_NEW, IsBackLayer(), TOOL_EVT_UTILS::IsCancelInteractive(), 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, PCB_ACTIONS::properties, BOARD_COMMIT::Push(), TOOL_MANAGER::RunAction(), TOOL_INTERACTIVE::RunMainStack(), PCB_TOOL::selection(), PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectItem, KIGFX::VIEW_CONTROLS::SetAutoPan(), EDA_ITEM::SetFlags(), BOARD_ITEM::SetLayer(), EDA_TEXT::SetMirrored(), EDA_DRAW_FRAME::SetMsgPanel(), 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(), TEXT, KIGFX::VIEW::Update(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by setTransitions().

323 {
324  if( m_editModules && !m_frame->GetModel() )
325  return 0;
326 
327  BOARD_ITEM* text = NULL;
328  const BOARD_DESIGN_SETTINGS& dsnSettings = m_frame->GetDesignSettings();
330  SELECTION& selection = selTool->GetSelection();
331  BOARD_COMMIT commit( m_frame );
332 
334  m_controls->ShowCursor( true );
335  m_controls->SetSnapping( true );
336  // do not capture or auto-pan until we start placing some text
337 
338  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::TEXT );
339 
340  Activate();
342  wxCURSOR_PENCIL, _( "Add text" ) );
343 
344  bool reselect = false;
345 
346  // Main loop: keep receiving events
347  while( OPT_TOOL_EVENT evt = Wait() )
348  {
349  VECTOR2I cursorPos = m_controls->GetCursorPosition();
350 
351  if( reselect && text )
353 
355  {
356  if( text )
357  {
359 
360  // Delete the old text and have another try
361  delete text;
362  text = NULL;
363 
364  m_controls->SetAutoPan( false );
365  m_controls->CaptureCursor( false );
366  m_controls->ShowCursor( true );
367  }
368  else
369  break;
370 
371  if( evt->IsActivate() ) // now finish unconditionally
372  break;
373  }
374  else if( evt->IsClick( BUT_RIGHT ) )
375  {
377  }
378  else if( evt->IsClick( BUT_LEFT ) )
379  {
380  if( !text )
381  {
382  // Init the new item attributes
383  if( m_editModules )
384  {
385  TEXTE_MODULE* textMod = new TEXTE_MODULE( (MODULE*) m_frame->GetModel() );
386 
387  textMod->SetLayer( m_frame->GetActiveLayer() );
388  textMod->SetTextSize( dsnSettings.m_ModuleTextSize );
389  textMod->SetThickness( dsnSettings.m_ModuleTextWidth );
390  textMod->SetTextPos( wxPoint( cursorPos.x, cursorPos.y ) );
391 
392  DIALOG_EDIT_FPTEXT textDialog( m_frame, m_frame, textMod, NULL );
393  bool placing;
394 
395  RunMainStack([&]() {
396  placing = textDialog.ShowModal() && ( textMod->GetText().Length() > 0 );
397  } );
398 
399  if( placing )
400  text = textMod;
401  else
402  delete textMod;
403  }
404  else
405  {
406  TEXTE_PCB* textPcb = new TEXTE_PCB( m_frame->GetModel() );
407  // TODO we have to set IS_NEW, otherwise InstallTextPCB.. creates an undo entry :| LEGACY_CLEANUP
408  textPcb->SetFlags( IS_NEW );
409 
411  textPcb->SetLayer( layer );
412 
413  // Set the mirrored option for layers on the BACK side of the board
414  if( IsBackLayer( layer ) )
415  textPcb->SetMirrored( true );
416 
417  textPcb->SetTextSize( dsnSettings.m_PcbTextSize );
418  textPcb->SetThickness( dsnSettings.m_PcbTextWidth );
419  textPcb->SetTextPos( wxPoint( cursorPos.x, cursorPos.y ) );
420 
421  RunMainStack([&]() {
422  getEditFrame<PCB_EDIT_FRAME>()->InstallTextPCBOptionsFrame( textPcb, NULL );
423  } );
424 
425  if( textPcb->GetText().IsEmpty() )
426  delete textPcb;
427  else
428  text = textPcb;
429  }
430 
431  if( text == NULL )
432  continue;
433 
434  m_controls->CaptureCursor( true );
435  m_controls->SetAutoPan( true );
436 
438  }
439  else
440  {
441  text->ClearFlags();
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  selection.SetReferencePoint( cursorPos );
458  m_view->Update( &selection );
459  frame()->SetMsgPanel( text );
460  }
461 
462  else if( text && evt->IsAction( &PCB_ACTIONS::properties ) )
463  {
464  // Calling 'Properties' action clears the selection, so we need to restore it
465  reselect = true;
466  }
467  }
468 
469  frame()->SetMsgPanel( board() );
471 
472  return 0;
473 }
void SetMirrored(bool isMirrored)
Definition: eda_text.h:176
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 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&#39;s a back layer.
Class SELECTION_TOOL.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:221
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:108
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:212
wxSize m_ModuleTextSize
Default footprint texts size.
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
#define IS_NEW
New item, just created.
Definition: base_struct.h:109
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:264
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Function SetMsgPanel clears the message panel and populates it with the contents of aList...
Definition: draw_frame.cpp:831
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:128
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
PCB_EDIT_FRAME * frame() const
Definition: pcb_tool.h:136
SELECTION & GetSelection()
Function GetSelection()
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:275
const SELECTION & selection() const
Definition: pcb_tool.cpp:221
bool IsCancelInteractive(const TOOL_EVENT &aEvt)
Function IsCancelInteractive()
virtual 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:1499
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:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
static TOOL_ACTION selectItem
Selects an item (specified as the event parameter).
Definition: pcb_actions.h:56
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:265
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
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:284
void SetThickness(int aNewThickness)
Function SetThickness sets pen width.
Definition: eda_text.h:146
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
BOARD * board() const
Definition: pcb_tool.h:137
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.

Reimplemented from PCB_TOOL.

Definition at line 203 of file drawing_tool.cpp.

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

204 {
205  // Init variables used by every drawing tool
206  m_view = getView();
208  m_board = getModel<BOARD>();
209  m_frame = getEditFrame<PCB_BASE_EDIT_FRAME>();
210 }
BOARD * m_board
Definition: drawing_tool.h:276
KIGFX::VIEW * m_view
Definition: drawing_tool.h:274
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:41
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:35
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:215
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 1321 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, STATUS_POPUP::Expire(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_BASE::getViewControls(), TOOL_EVT_UTILS::IsCancelInteractive(), POLYGON_GEOM_MANAGER::IsPolygonInProgress(), POLYGON_GEOM_MANAGER::IsSelfIntersecting(), m_frame, m_menu, MD_CTRL, STATUS_POPUP::Move(), POLYGON_GEOM_MANAGER::NewPointClosesOutline(), STATUS_POPUP::Popup(), POLYGON_GEOM_MANAGER::Reset(), KIGFX::VIEW_CONTROLS::SetAutoPan(), POLYGON_GEOM_MANAGER::SetCursorPosition(), POLYGON_GEOM_MANAGER::SetFinished(), STATUS_TEXT_POPUP::SetText(), STATUS_TEXT_POPUP::SetTextColor(), TOOL_MENU::ShowContextMenu(), and TOOL_INTERACTIVE::Wait().

Referenced by drawZone().

1322 {
1323  auto& controls = *getViewControls();
1324  bool started = false;
1325 
1326  STATUS_TEXT_POPUP status( m_frame );
1327  status.SetTextColor( wxColour( 255, 0, 0 ) );
1328  status.SetText( _( "Self-intersecting polygons are not allowed" ) );
1329 
1330  while( OPT_TOOL_EVENT evt = Wait() )
1331  {
1332  VECTOR2I cursorPos = controls.GetCursorPosition();
1333 
1335  {
1336  // pre-empted by another tool, give up
1337  // cancelled without an inprogress polygon, give up
1338  if( !polyGeomMgr.IsPolygonInProgress() || evt->IsActivate() )
1339  {
1340  break;
1341  }
1342 
1343  polyGeomMgr.Reset();
1344  // start again
1345  started = false;
1346 
1347  controls.SetAutoPan( false );
1348  controls.CaptureCursor( false );
1349  }
1350  else if( evt->IsClick( BUT_RIGHT ) )
1351  {
1353  }
1354  // events that lock in nodes
1355  else if( evt->IsClick( BUT_LEFT )
1356  || evt->IsDblClick( BUT_LEFT )
1357  || evt->IsAction( &closeZoneOutline ) )
1358  {
1359  // Check if it is double click / closing line (so we have to finish the zone)
1360  const bool endPolygon = evt->IsDblClick( BUT_LEFT )
1361  || evt->IsAction( &closeZoneOutline )
1362  || polyGeomMgr.NewPointClosesOutline( cursorPos );
1363 
1364  if( endPolygon )
1365  {
1366  polyGeomMgr.SetFinished();
1367  polyGeomMgr.Reset();
1368 
1369  // ready to start again
1370  started = false;
1371  controls.SetAutoPan( false );
1372  controls.CaptureCursor( false );
1373  }
1374 
1375  // adding a corner
1376  else if( polyGeomMgr.AddPoint( cursorPos ) )
1377  {
1378  if( !started )
1379  {
1380  started = true;
1381  controls.SetAutoPan( true );
1382  controls.CaptureCursor( true );
1383  }
1384  }
1385 
1386  }
1387  else if( evt->IsAction( &deleteLastPoint ) )
1388  {
1389  polyGeomMgr.DeleteLastCorner();
1390 
1391  if( !polyGeomMgr.IsPolygonInProgress() )
1392  {
1393  // report finished as an empty shape
1394  polyGeomMgr.SetFinished();
1395 
1396  // start again
1397  started = false;
1398  controls.SetAutoPan( false );
1399  controls.CaptureCursor( false );
1400  }
1401  }
1402  else if( polyGeomMgr.IsPolygonInProgress()
1403  && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
1404  {
1405  polyGeomMgr.SetCursorPosition( cursorPos, evt->Modifier( MD_CTRL )
1408 
1409  if( polyGeomMgr.IsSelfIntersecting( true ) )
1410  {
1411  wxPoint p = wxGetMousePosition() + wxPoint( 20, 20 );
1412  status.Move( p );
1413  status.Popup( m_frame );
1414  status.Expire( 1500 );
1415  }
1416  else
1417  {
1418  status.Hide();
1419  }
1420  }
1421  } // end while
1422 }
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)
Class STATUS_TEXT_POPUP.
Definition: status_popup.h:77
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:135
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:41
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:277
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:284
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
const SELECTION & PCB_TOOL::selection ( ) const
protectedinherited

Definition at line 221 of file pcb_tool.cpp.

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

Referenced by PAD_TOOL::applyPadSettings(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), ROUTER_TOOL::CanInlineDrag(), PAD_TOOL::copyPadSettings(), EDIT_TOOL::copyToClipboard(), EDIT_TOOL::CreateArray(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), PCB_EDITOR_CONTROL::CrossProbePcbToSch(), deleteItem(), EDIT_TOOL::Duplicate(), EDIT_TOOL::editFootprintInFpEditor(), EDIT_TOOL::ExchangeFootprints(), SELECTION_TOOL::expandSelectedConnection(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), SELECTION_TOOL::filterSelection(), EDIT_TOOL::Flip(), getSourceZoneForAction(), highlightNet(), ROUTER_TOOL::InlineDrag(), EDIT_TOOL::Main(), EDIT_TOOL::Mirror(), PCB_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), POINT_EDITOR::OnSelectionChange(), PCBNEW_CONTROL::placeBoardItems(), PCB_EDITOR_CONTROL::PlaceModule(), PlaceText(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), EDIT_TOOL::Remove(), EDIT_TOOL::Rotate(), SELECTION_TOOL::selectCopper(), PCB_TOOL::selection(), SELECTION_TOOL::selectNet(), selectPRitem(), showLocalRatsnest(), PCB_EDITOR_CONTROL::UpdateSelectionRatsnest(), PCB_EDITOR_CONTROL::ZoneDuplicate(), ZONE_FILLER_TOOL::ZoneFill(), PCB_EDITOR_CONTROL::ZoneMerge(), and ZONE_FILLER_TOOL::ZoneUnfill().

222 {
223  auto selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
224  const auto& selection = selTool->GetSelection();
225  return selection;
226 }
Class SELECTION_TOOL.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
const SELECTION & selection() const
Definition: pcb_tool.cpp:221
SELECTION & PCB_TOOL::selection ( )
protectedinherited

Definition at line 228 of file pcb_tool.cpp.

References TOOL_MANAGER::GetTool(), TOOL_BASE::m_toolMgr, and PCB_TOOL::selection().

229 {
230  auto selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
231  auto& selection = selTool->GetSelection();
232  return selection;
233 }
Class SELECTION_TOOL.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:215
const SELECTION & selection() const
Definition: pcb_tool.cpp:221
int DRAWING_TOOL::SetAnchor ( const TOOL_EVENT aEvent)

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

Definition at line 910 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(), PCB_TOOL::module(), 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().

911 {
912  assert( m_editModules );
913 
914  if( !m_frame->GetModel() )
915  return 0;
916 
917  SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::ANCHOR );
918 
919  Activate();
920  m_frame->SetToolID( ID_MODEDIT_ANCHOR_TOOL, wxCURSOR_PENCIL,
921  _( "Place the footprint anchor" ) );
922 
923  m_controls->ShowCursor( true );
924  m_controls->SetSnapping( true );
925  m_controls->SetAutoPan( true );
926  m_controls->CaptureCursor( false );
927 
928  while( OPT_TOOL_EVENT evt = Wait() )
929  {
930  if( evt->IsClick( BUT_LEFT ) )
931  {
933  BOARD_COMMIT commit( m_frame );
934  commit.Modify( module );
935 
936  // set the new relative internal local coordinates of footprint items
937  VECTOR2I cursorPos = m_controls->GetCursorPosition();
938  wxPoint moveVector = module->GetPosition() - wxPoint( cursorPos.x, cursorPos.y );
939  module->MoveAnchorPosition( moveVector );
940 
941  commit.Push( _( "Move the footprint reference anchor" ) );
942 
943  // Usually, we do not need to change twice the anchor position,
944  // so deselect the active tool
945  break;
946  }
947  else if( evt->IsClick( BUT_RIGHT ) )
948  {
950  }
951  else if( TOOL_EVT_UTILS::IsCancelInteractive( *evt ) )
952  break;
953  }
954 
956 
957  return 0;
958 }
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.
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.
MODULE * module() const
Definition: pcb_tool.h:138
KIGFX::VIEW_CONTROLS * m_controls
Definition: drawing_tool.h:275
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:277
bool m_editModules
Definition: pcb_tool.h:144
virtual void SetNoToolSelected()
Select the ID_NO_TOOL_SELECTED id tool (Idle tool)
Definition: draw_frame.cpp:615
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
const wxPoint GetPosition() const override
Definition: class_module.h:182
TOOL_MENU m_menu
Menu model displayed by the tool.
Definition: drawing_tool.h:284
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:465
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 GERBVIEW_SELECTION_TOOL::disambiguationMenu(), 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:215
void ScheduleContextMenu(TOOL_BASE *aTool, CONTEXT_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger)
Sets behaviour of the tool&#39;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 94 of file pcb_tool.h.

95  {
96  m_editModules = aEnabled;
97  }
bool m_editModules
Definition: pcb_tool.h:144
void DRAWING_TOOL::setTransitions ( )
overridevirtual

Sets up handlers for various events.

Reimplemented from PCB_TOOL.

Definition at line 1696 of file drawing_tool.cpp.

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

1697 {
1711 }
static TOOL_ACTION drawLine
Activation of the drawing tool (line)
Definition: pcb_actions.h:139
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:178
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:169
static TOOL_ACTION drawArc
Activation of the drawing tool (arc)
Definition: pcb_actions.h:148
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:163
static TOOL_ACTION setAnchor
Activation of the drawing tool (placing the footprint anchor)
Definition: pcb_actions.h:181
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:151
static TOOL_ACTION drawGraphicPolygon
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:154
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:160
static TOOL_ACTION drawZoneCutout
Activation of the drawing tool (drawing a ZONE cutout)
Definition: pcb_actions.h:166
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:145
int SetAnchor(const TOOL_EVENT &aEvent)
Function SetAnchor() Places the footprint anchor (only in module editor).
int DrawGraphicPolygon(const TOOL_EVENT &aEvent)
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:157
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 PCBNEW_CONTROL::DeleteItemCursor(), GERBVIEW_SELECTION_TOOL::disambiguationMenu(), 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(), GERBVIEW_SELECTION_TOOL::Main(), SELECTION_TOOL::Main(), LENGTH_TUNER_TOOL::mainLoop(), ROUTER_TOOL::mainLoop(), GERBVIEW_SELECTION_TOOL::MeasureTool(), EDIT_TOOL::MeasureTool(), POINT_EDITOR::OnSelectionChange(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), EDIT_TOOL::pickCopyReferencePoint(), PlaceDXF(), PCB_EDITOR_CONTROL::PlaceModule(), PCB_EDITOR_CONTROL::PlaceTarget(), PlaceText(), runPolygonEventLoop(), GERBVIEW_SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectMultiple(), GERBVIEW_SELECTION_TOOL::selectPoint(), 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:215
OPT< 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 291 of file drawing_tool.h.

Member Data Documentation

BOARD* DRAWING_TOOL::m_board
private

Definition at line 276 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 281 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 284 of file drawing_tool.h.

Referenced by drawArc(), DrawDimension(), drawSegment(), 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 210 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), and TOOL_BASE::IsToolActive().

TOOL_MANAGER* TOOL_BASE::m_toolMgr
protectedinherited

Definition at line 215 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PAD_TOOL::applyPadSettings(), TOOL_BASE::attachManager(), PCB_EDITOR_CONTROL::calculateSelectionRatsnest(), ROUTER_TOOL::CanInlineDrag(), GERBVIEW_SELECTION_TOOL::clearSelection(), SELECTION_TOOL::clearSelection(), PAD_TOOL::copyPadSettings(), MODULE_EDITOR_TOOLS::CreatePadFromShapes(), 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::expandSelectedConnection(), MODULE_EDITOR_TOOLS::ExplodePadToShapes(), SELECTION_TOOL::findCallback(), SELECTION_TOOL::findMove(), EDIT_TOOL::Flip(), TOOL_BASE::getEditFrameInt(), TOOL_BASE::getModelInt(), getSourceZoneForAction(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_INTERACTIVE::goInternal(), PCBNEW_CONTROL::GridSetOrigin(), GERBVIEW_CONTROL::HighlightControl(), PCB_EDITOR_CONTROL::HighlightNet(), PCB_EDITOR_CONTROL::HighlightNetCursor(), PICKER_TOOL::Init(), 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(), EDIT_TOOL::isInteractiveDragEnabled(), TOOL_BASE::IsToolActive(), 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(), EDIT_TOOL::pickCopyReferencePoint(), PCBNEW_CONTROL::placeBoardItems(), 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(), POINT_EDITOR::removeCorner(), GERBVIEW_SELECTION_TOOL::RequestSelection(), SELECTION_TOOL::RequestSelection(), PCBNEW_CONTROL::ResetCoords(), TOOL_INTERACTIVE::resetTransitions(), EDIT_TOOL::Rotate(), TOOL_INTERACTIVE::RunMainStack(), SELECTION_TOOL::SanitizeSelection(), SELECTION_TOOL::selectCopper(), PCB_TOOL::selection(), GERBVIEW_SELECTION_TOOL::SelectItem(), SELECTION_TOOL::SelectItem(), GERBVIEW_SELECTION_TOOL::SelectItems(), SELECTION_TOOL::SelectItems(), GERBVIEW_SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectMultiple(), SELECTION_TOOL::selectNet(), SELECTION_TOOL::selectOnSheetFromEeschema(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), SELECTION_TOOL::selectSameSheet(), TOOL_INTERACTIVE::SetContextMenu(), PCB_EDITOR_CONTROL::ShowLocalRatsnest(), GERBVIEW_SELECTION_TOOL::toggleSelection(), SELECTION_TOOL::toggleSelection(), PCB_EDITOR_CONTROL::TrackWidthDec(), PCB_EDITOR_CONTROL::TrackWidthInc(), GERBVIEW_SELECTION_TOOL::UnselectItem(), SELECTION_TOOL::UnselectItem(), GERBVIEW_SELECTION_TOOL::UnselectItems(), SELECTION_TOOL::UnselectItems(), PCB_EDITOR_CONTROL::UpdateSelectionRatsnest(), PCB_EDITOR_CONTROL::ViaSizeDec(), PCB_EDITOR_CONTROL::ViaSizeInc(), TOOL_INTERACTIVE::Wait(), PCB_EDITOR_CONTROL::ZoneDuplicate(), and PCB_EDITOR_CONTROL::ZoneMerge().

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

TOOL_SETTINGS TOOL_BASE::m_toolSettings
protectedinherited

Definition at line 216 of file tool_base.h.

Referenced by TOOL_BASE::attachManager().

TOOL_TYPE TOOL_BASE::m_type
protectedinherited

Stores the type of the tool.

Definition at line 207 of file tool_base.h.

KIGFX::VIEW* DRAWING_TOOL::m_view
private

Definition at line 274 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 287 of file drawing_tool.h.

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


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