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-2019 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 "microwave_tool.h"
26 #include <class_draw_panel_gal.h>
27 #include <view/view_controls.h>
28 #include <view/view.h>
29 #include <tool/tool_manager.h>
30 #include <board_commit.h>
31 #include <confirm.h>
34 #include <bitmaps.h>
35 #include <class_board_item.h>
36 #include <class_module.h>
38 #include "pcb_actions.h"
39 #include "selection_tool.h"
40 
41 
43  PCB_TOOL_BASE( "pcbnew.MicrowaveTool" )
44 {
45 }
46 
47 
49 {}
50 
51 
53 {
54 }
55 
56 
58 {
59  PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();
60 
61  struct MICROWAVE_PLACER : public INTERACTIVE_PLACER_BASE
62  {
63  MICROWAVE_PLACER( PCB_EDIT_FRAME* aFrame, int aType ) :
64  m_frame( aFrame ),
65  m_itemType( aType )
66  { };
67 
68  virtual ~MICROWAVE_PLACER()
69  {
70  }
71 
72  std::unique_ptr<BOARD_ITEM> CreateItem() override
73  {
74  switch( m_itemType )
75  {
77  return std::unique_ptr<MODULE>( m_frame->Create_MuWaveComponent( 0 ) );
79  return std::unique_ptr<MODULE>( m_frame->Create_MuWaveComponent( 1 ) );
81  return std::unique_ptr<MODULE>( m_frame->Create_MuWaveComponent( 2 ) );
83  return std::unique_ptr<MODULE>( m_frame->Create_MuWavePolygonShape() );
84  default:
85  return std::unique_ptr<MODULE>();
86  };
87  }
88 
89  private:
90  PCB_EDIT_FRAME* m_frame;
91  int m_itemType;
92  };
93 
94  MICROWAVE_PLACER placer( frame, aEvent.Parameter<intptr_t>() );
95 
96  doInteractiveItemPlacement( aEvent.GetCommandStr().get(), &placer,
97  _( "Place microwave feature" ),
99 
100  return 0;
101 }
102 
103 
104 void MICROWAVE_TOOL::createInductorBetween( const VECTOR2I& aStart, const VECTOR2I& aEnd )
105 {
106  auto& frame = *getEditFrame<PCB_EDIT_FRAME>();
107 
108  MWAVE::INDUCTOR_PATTERN pattern;
109 
111 
112  pattern.m_Start = { aStart.x, aStart.y };
113  pattern.m_End = { aEnd.x, aEnd.y };
114 
115  wxString errorMessage;
116 
117  auto inductorModule = std::unique_ptr<MODULE>( CreateMicrowaveInductor( pattern, &frame,
118  errorMessage ) );
119 
120  // on any error, report if we can
121  if ( !inductorModule || !errorMessage.IsEmpty() )
122  {
123  if ( !errorMessage.IsEmpty() )
124  DisplayError( &frame, errorMessage );
125  }
126  else
127  {
128  // at this point, we can save the module
129  m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, inductorModule.get() );
130 
131  BOARD_COMMIT commit( this );
132  commit.Add( inductorModule.release() );
133  commit.Push( _("Add microwave inductor" ) );
134  }
135 }
136 
137 
138 static const COLOR4D inductorAreaFill( 0.3, 0.3, 0.5, 0.3 );
139 static const COLOR4D inductorAreaStroke( 0.4, 1.0, 1.0, 1.0 );
140 static const double inductorAreaStrokeWidth = 1.0;
141 
144 static const double inductorAreaAspect = 0.5;
145 
146 
148 {
149  using namespace KIGFX::PREVIEW;
150 
151  KIGFX::VIEW& view = *getView();
153  auto& frame = *getEditFrame<PCB_EDIT_FRAME>();
154 
155  std::string tool = aEvent.GetCommandStr().get();
156  frame.PushTool( tool );
157  Activate();
158 
159  TWO_POINT_GEOMETRY_MANAGER tpGeomMgr;
160 
161  CENTRELINE_RECT_ITEM previewRect( tpGeomMgr, inductorAreaAspect );
162 
163  previewRect.SetFillColor( inductorAreaFill );
164  previewRect.SetStrokeColor( inductorAreaStroke );
165  previewRect.SetLineWidth( inductorAreaStrokeWidth );
166 
167  bool originSet = false;
168 
169  controls.ShowCursor( true );
170  controls.SetSnapping( true );
171  controls.CaptureCursor( false );
172  controls.SetAutoPan( false );
173 
174  view.Add( &previewRect );
175 
176  while( auto evt = Wait() )
177  {
178  frame.GetCanvas()->SetCurrentCursor( wxCURSOR_PENCIL );
179  VECTOR2I cursorPos = controls.GetCursorPosition();
180 
181  auto cleanup = [&] () {
182  originSet = false;
183  controls.CaptureCursor( false );
184  controls.SetAutoPan( false );
185  view.SetVisible( &previewRect, false );
186  view.Update( &previewRect, KIGFX::GEOMETRY );
187  };
188 
189  if( evt->IsCancelInteractive() )
190  {
191  if( originSet )
192  cleanup();
193  else
194  {
195  frame.PopTool( tool );
196  break;
197  }
198  }
199 
200  else if( evt->IsActivate() )
201  {
202  if( originSet )
203  cleanup();
204 
205  if( evt->IsMoveTool() )
206  {
207  // leave ourselves on the stack so we come back after the move
208  break;
209  }
210  else
211  {
212  frame.PopTool( tool );
213  break;
214  }
215  }
216 
217  // A click or drag starts
218  else if( !originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsDrag( BUT_LEFT ) ) )
219  {
220  tpGeomMgr.SetOrigin( cursorPos );
221  tpGeomMgr.SetEnd( cursorPos );
222 
223  originSet = true;
224  controls.CaptureCursor( true );
225  controls.SetAutoPan( true );
226  }
227 
228  // another click after origin set is the end
229  // left up is also the end, as you'll only get that after a drag
230  else if( originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) )
231  {
232  // second click, we're done:
233  // delegate to the point-to-point inductor creator function
234  createInductorBetween( tpGeomMgr.GetOrigin(), tpGeomMgr.GetEnd() );
235 
236  // start again if needed
237  originSet = false;
238  controls.CaptureCursor( false );
239  controls.SetAutoPan( false );
240 
241  view.SetVisible( &previewRect, false );
242  view.Update( &previewRect, KIGFX::GEOMETRY );
243  }
244 
245  // any move or drag once the origin was set updates
246  // the end point
247  else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
248  {
249  tpGeomMgr.SetAngleSnap( evt->Modifier( MD_CTRL ) );
250  tpGeomMgr.SetEnd( cursorPos );
251 
252  view.SetVisible( &previewRect, true );
253  view.Update( &previewRect, KIGFX::GEOMETRY );
254  }
255 
256  else if( evt->IsClick( BUT_RIGHT ) )
257  {
259  }
260 
261  else
262  evt->SetPassEvent();
263  }
264 
265  controls.CaptureCursor( false );
266  controls.SetAutoPan( false );
267  view.Remove( &previewRect );
268  return 0;
269 }
270 
271 
273 {
278 
280 }
virtual void ShowCursor(bool aEnabled)
Function ShowCursor() Enables or disables display of cursor.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:239
static const double inductorAreaStrokeWidth
virtual void PushTool(const std::string &actionName)
NB: the definition of "tool" is different at the user level.
void SetLineWidth(double aNewWidth)
Set the line width to set before drawing preview
TOOL_MENU m_menu
functions below are not yet implemented - their interface may change
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Function Wait()
BOARD * board() const
void SetStrokeColor(const COLOR4D &aNewColor)
Set the stroke colour to set before drawing preview
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
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:91
This file is part of the common library.
static const double inductorAreaAspect
Aspect of the preview rectangle - this is hardcoded in the microwave backend for now
static TOOL_ACTION microwaveCreateStubArc
Definition: pcb_actions.h:392
COMMIT & Add(EDA_ITEM *aItem)
Adds a new item to the model
Definition: commit.h:78
void SetCurrentCursor(wxStockCursor aStockCursorID)
Function SetCurrentCursor Set the current cursor shape for this panel.
VIEW_CONTROLS class definition.
Classes BOARD_ITEM and BOARD_CONNECTED_ITEM.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
Parameters for construction of a microwave inductor.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:218
void Reset(RESET_REASON aReason) override
React to model/view changes
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:139
static TOOL_ACTION microwaveCreateLine
Definition: pcb_actions.h:396
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:512
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
static const COLOR4D inductorAreaFill(0.3, 0.3, 0.5, 0.3)
virtual void Remove(VIEW_ITEM *aItem) override
Function Remove() Removes a VIEW_ITEM from the view.
Definition: pcb_view.cpp:74
PCB_BASE_EDIT_FRAME * frame() const
void createInductorBetween(const VECTOR2I &aStart, const VECTOR2I &aEnd)
Create an inductor between the two points
const PCBNEW_SELECTION & selection() const
static const COLOR4D inductorAreaStroke(0.4, 1.0, 1.0, 1.0)
virtual void CaptureCursor(bool aEnabled)
Function CaptureCursor() Forces the cursor to stay within the drawing panel area.
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:435
TOOL_EVENT.
Definition: tool_event.h:171
void SetOrigin(const VECTOR2I &aOrigin)
Set the origin of the ruler (the fixed end)
KIGFX::PCB_VIEW * view() const
VIEW_CONTROLS is an interface for classes handling user events controlling the view behaviour (such a...
static TOOL_ACTION microwaveCreateGap
Definition: pcb_actions.h:388
void SetFillColor(const COLOR4D &aNewColor)
Set the fill colour to set before drawing preview
void setTransitions() override
Bind handlers to corresponding TOOL_ACTIONs
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:36
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 microwaveCreateStub
Definition: pcb_actions.h:390
int drawMicrowaveInductor(const TOOL_EVENT &aEvent)
Draw a microwave inductor interactively
OPT< std::string > GetCommandStr() const
Definition: tool_event.h:463
static TOOL_ACTION microwaveCreateFunctionShape
Definition: pcb_actions.h:394
MODULE * CreateMicrowaveInductor(INDUCTOR_PATTERN &aPattern, PCB_EDIT_FRAME *aPcbFrame, wxString &aErrorMessage)
Creates an S-shaped coil footprint for microwave applications.
int addMicrowaveFootprint(const TOOL_EVENT &aEvent)
Main interactive tool
KIGFX::VIEW_CONTROLS * controls() const
#define _(s)
Definition: 3d_actions.cpp:33
static TOOL_ACTION selectItem
Selects an item (specified as the event parameter).
Definition: pcb_actions.h:76
PCB_EDIT_FRAME is the main frame for Pcbnew.
virtual void Push(const wxString &aMessage=wxT("A commit"), bool aCreateUndoEntry=true, bool aSetDirtyBit=true) override
Executes the changes.
RESET_REASON
Determines the reason of reset for a tool
Definition: tool_base.h:78
virtual void PopTool(const std::string &actionName)
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1486
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:58
Module description (excepted pads)
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
Function getViewControls()
Definition: tool_base.cpp:42
VIEW.
Definition: view.h:61
void ShowContextMenu(SELECTION &aSelection)
Function ShowContextMenu.
Definition: tool_menu.cpp:59
VECTOR2D GetCursorPosition() const
Returns 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.
Color has changed.
Definition: view_item.h:57
COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:40