KiCad PCB EDA Suite
microwave_tool.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2017-2021 Kicad Developers, see change_log.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <bitmaps.h>
25 #include <board_commit.h>
26 #include <board_item.h>
27 #include <class_draw_panel_gal.h>
28 #include <footprint.h>
29 #include <confirm.h>
34 #include <tool/tool_manager.h>
35 #include <tools/pcb_actions.h>
36 #include <view/view_controls.h>
37 #include <view/view.h>
38 
39 
41  PCB_TOOL_BASE( "pcbnew.MicrowaveTool" )
42 {
43 }
44 
45 
47 {}
48 
49 
51 {
52 }
53 
54 
56 {
57  struct MICROWAVE_PLACER : public INTERACTIVE_PLACER_BASE
58  {
59  MICROWAVE_PLACER( MICROWAVE_TOOL* aTool, MICROWAVE_FOOTPRINT_SHAPE aType ) :
60  m_tool( aTool ),
61  m_itemType( aType )
62  { };
63 
64  virtual ~MICROWAVE_PLACER()
65  {
66  }
67 
68  std::unique_ptr<BOARD_ITEM> CreateItem() override
69  {
70  switch( m_itemType )
71  {
75  return std::unique_ptr<FOOTPRINT>( m_tool->createFootprint( m_itemType ) );
76 
78  return std::unique_ptr<FOOTPRINT>( m_tool->createPolygonShape() );
79 
80  default:
81  return std::unique_ptr<FOOTPRINT>();
82  };
83  }
84 
85  private:
86  MICROWAVE_TOOL* m_tool;
87  MICROWAVE_FOOTPRINT_SHAPE m_itemType;
88  };
89 
90  MICROWAVE_PLACER placer( this, aEvent.Parameter<MICROWAVE_FOOTPRINT_SHAPE>() );
91 
92  doInteractiveItemPlacement( aEvent.GetCommandStr().get(), &placer,
93  _( "Place microwave feature" ),
95 
96  return 0;
97 }
98 
99 
100 static const COLOR4D inductorAreaFill( 0.3, 0.3, 0.5, 0.3 );
101 static const COLOR4D inductorAreaStroke( 0.4, 1.0, 1.0, 1.0 );
102 static const double inductorAreaStrokeWidth = 1.0;
103 
106 static const double inductorAreaAspect = 0.5;
107 
108 
110 {
111  using namespace KIGFX::PREVIEW;
112 
113  KIGFX::VIEW& view = *getView();
115  PCB_EDIT_FRAME& frame = *getEditFrame<PCB_EDIT_FRAME>();
116 
117  std::string tool = aEvent.GetCommandStr().get();
118  frame.PushTool( tool );
119 
120  auto setCursor =
121  [&]()
122  {
124  };
125 
126  Activate();
127  // Must be done after Activate() so that it gets set into the correct context
128  controls.ShowCursor( true );
129  controls.CaptureCursor( false );
130  controls.SetAutoPan( false );
131  // Set initial cursor
132  setCursor();
133 
134  bool originSet = false;
135  TWO_POINT_GEOMETRY_MANAGER tpGeomMgr;
136  CENTRELINE_RECT_ITEM previewRect( tpGeomMgr, inductorAreaAspect );
137 
138  previewRect.SetFillColor( inductorAreaFill );
139  previewRect.SetStrokeColor( inductorAreaStroke );
140  previewRect.SetLineWidth( inductorAreaStrokeWidth );
141  view.Add( &previewRect );
142 
143  while( auto evt = Wait() )
144  {
145  setCursor();
146  VECTOR2I cursorPos = controls.GetCursorPosition();
147 
148  auto cleanup =
149  [&] ()
150  {
151  originSet = false;
152  controls.CaptureCursor( false );
153  controls.SetAutoPan( false );
154  view.SetVisible( &previewRect, false );
155  view.Update( &previewRect, KIGFX::GEOMETRY );
156  };
157 
158  if( evt->IsCancelInteractive() )
159  {
160  if( originSet )
161  cleanup();
162  else
163  {
164  frame.PopTool( tool );
165  break;
166  }
167  }
168  else if( evt->IsActivate() )
169  {
170  if( originSet )
171  cleanup();
172 
173  if( evt->IsMoveTool() )
174  {
175  // leave ourselves on the stack so we come back after the move
176  break;
177  }
178  else
179  {
180  frame.PopTool( tool );
181  break;
182  }
183  }
184  // A click or drag starts
185  else if( !originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsDrag( BUT_LEFT ) ) )
186  {
187  tpGeomMgr.SetOrigin( cursorPos );
188  tpGeomMgr.SetEnd( cursorPos );
189 
190  originSet = true;
191  controls.CaptureCursor( true );
192  controls.SetAutoPan( true );
193  }
194  // another click after origin set is the end
195  // left up is also the end, as you'll only get that after a drag
196  else if( originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) )
197  {
198  // second click, we're done:
199  // delegate to the point-to-point inductor creator function
200  createInductorBetween( tpGeomMgr.GetOrigin(), tpGeomMgr.GetEnd() );
201 
202  // start again if needed
203  originSet = false;
204  controls.CaptureCursor( false );
205  controls.SetAutoPan( false );
206 
207  view.SetVisible( &previewRect, false );
208  view.Update( &previewRect, KIGFX::GEOMETRY );
209  }
210  // any move or drag once the origin was set updates
211  // the end point
212  else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
213  {
214  tpGeomMgr.SetAngleSnap( Is45Limited() );
215  tpGeomMgr.SetEnd( cursorPos );
216 
217  view.SetVisible( &previewRect, true );
218  view.Update( &previewRect, KIGFX::GEOMETRY );
219  }
220  else if( evt->IsClick( BUT_RIGHT ) )
221  {
223  }
224  else
225  {
226  evt->SetPassEvent();
227  }
228  }
229 
230  view.Remove( &previewRect );
231 
233  controls.CaptureCursor( false );
234  controls.SetAutoPan( false );
235  return 0;
236 }
237 
238 
239 
241 {
247 
249 }
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
static const double inductorAreaStrokeWidth
Aspect of the preview rectangle - this is hardcoded in the microwave backend for now.
Represent an area drawn by drawing a rectangle of a given aspect along a vector, with the midpoint of...
TOOL_MENU m_menu
The functions below are not yet implemented - their interface may change.
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
Handle flip action in the loop by calling the item's flip method.
void SetStrokeColor(const COLOR4D &aNewColor)
Set the fill color to set before drawing preview.
This file is part of the common library.
static const double inductorAreaAspect
static TOOL_ACTION microwaveCreateStubArc
Definition: pcb_actions.h:412
~MICROWAVE_TOOL()
React to model/view changes.
Represent a very simple geometry manager for items that have a start and end point.
Tool responsible for adding microwave features to PCBs.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void Reset(RESET_REASON aReason) override
Bind handlers to corresponding TOOL_ACTIONs.
virtual void PushTool(const std::string &actionName)
NB: the definition of "tool" is different at the user level.
static TOOL_ACTION microwaveCreateLine
Definition: pcb_actions.h:416
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
static const COLOR4D inductorAreaFill(0.3, 0.3, 0.5, 0.3)
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition: pcb_view.cpp:75
PCB_BASE_EDIT_FRAME * frame() const
void createInductorBetween(const VECTOR2I &aStart, const VECTOR2I &aEnd)
Draw a microwave inductor interactively.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: pcb_view.cpp:92
static const COLOR4D inductorAreaStroke(0.4, 1.0, 1.0, 1.0)
const PCB_SELECTION & selection() const
Allow repeat placement of the item.
virtual void PopTool(const std::string &actionName)
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
T Parameter() const
Return a non-standard parameter assigned to the event.
Definition: tool_event.h:432
Generic, UI-independent tool event.
Definition: tool_event.h:152
void SetOrigin(const VECTOR2I &aOrigin)
< Set the origin of the ruler (the fixed end)
KIGFX::PCB_VIEW * view() const
An interface for classes handling user events controlling the view behavior such as zooming,...
#define _(s)
static TOOL_ACTION microwaveCreateGap
Definition: pcb_actions.h:408
void SetFillColor(const COLOR4D &aNewColor)
Set the line width to set before drawing preview.
bool Is45Limited() const
Should the tool use its 45° mode option?
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
static TOOL_ACTION microwaveCreateStub
Definition: pcb_actions.h:410
int drawMicrowaveInductor(const TOOL_EVENT &aEvent)
OPT< std::string > GetCommandStr() const
Definition: tool_event.h:460
Handle the rotate action in the loop by calling the item's rotate method.
static TOOL_ACTION microwaveCreateFunctionShape
Definition: pcb_actions.h:414
int addMicrowaveFootprint(const TOOL_EVENT &aEvent)
< Main interactive tool
KIGFX::VIEW_CONTROLS * controls() const
The main frame for Pcbnew.
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:77
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1464
void Activate()
Run the tool.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition: pcb_view.cpp:58
void doInteractiveItemPlacement(const std::string &aTool, 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...
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
MICROWAVE_FOOTPRINT_SHAPE
void ShowContextMenu(SELECTION &aSelection)
Helper function to set and immediately show a CONDITIONAL_MENU in concert with the given SELECTION.
Definition: tool_menu.cpp:59
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
void SetEnd(const VECTOR2I &aEnd)
Set the current end of the rectangle (the end that moves with the cursor.
Position or shape has changed.
Definition: view_item.h:54
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103