KiCad PCB EDA Suite
sch_draw_panel.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) 2014-2019 CERN
5  * @author Maciej Suminski <maciej.suminski@cern.ch>
6  * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 
27 #include <sch_draw_panel.h>
28 
29 #include <wx/debug.h>
30 #include <wx/event.h>
31 #include <wx/gdicmn.h>
32 #include <wx/window.h>
33 #include <wx/windowid.h>
34 #include <memory>
35 #include <stdexcept>
36 
37 #include <confirm.h>
38 #include <eda_draw_frame.h>
39 #include <gal/definitions.h>
42 #include <math/vector2d.h>
43 #include <pgm_base.h>
45 #include <view/view.h>
46 #include <view/view_controls.h>
47 #include <view/wx_view_controls.h>
48 
49 #include <sch_base_frame.h>
50 #include <sch_painter.h>
51 #include <zoom_defines.h>
52 
53 
54 SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId,
55  const wxPoint& aPosition, const wxSize& aSize,
56  KIGFX::GAL_DISPLAY_OPTIONS& aOptions, GAL_TYPE aGalType )
57  : EDA_DRAW_PANEL_GAL( aParentWindow, aWindowId, aPosition, aSize, aOptions, aGalType )
58 {
59  m_currentCursor = wxCURSOR_ARROW;
60  m_view = new KIGFX::SCH_VIEW( true, dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() ) );
61  m_view->SetGAL( m_gal );
62 
64 
65  m_painter.reset( new KIGFX::SCH_PAINTER( m_gal ) );
66 
67  COLOR_SETTINGS* cs = nullptr;
68 
69  if( auto frame = dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() ) )
70  cs = frame->GetColorSettings();
71  else
72  cs = Pgm().GetSettingsManager().GetColorSettings();
73 
74  wxASSERT( cs );
75  m_painter->GetSettings()->LoadColors( cs );
76 
77  m_view->SetPainter( m_painter.get() );
78  // This fixes the zoom in and zoom out limits:
80  m_view->SetMirror( false, false );
81 
82  // Early initialization of the canvas background color,
83  // before any OnPaint event is fired for the canvas using a wrong bg color
84  auto settings = m_painter->GetSettings();
85  m_gal->SetClearColor( settings->GetBackgroundColor() );
86 
89 
91 
92  // View controls is the first in the event handler chain, so the Tool Framework operates
93  // on updated viewport data.
95 
96  SetEvtHandlerEnabled( true );
97  SetFocus();
98  Show( true );
99  Raise();
100  StartDrawing();
101 }
102 
103 
105 {
106 }
107 
108 
110 {
111  GetView()->Clear();
112  GetView()->DisplayComponent( aComponent );
113 }
114 
115 
117 {
118  GetView()->Clear();
119 
120  if( aScreen )
121  GetView()->DisplaySheet( aScreen );
122  else
123  GetView()->Cleanup();
124 }
125 
126 
128 {
129  for( LAYER_NUM i = 0; (unsigned) i < sizeof( SCH_LAYER_ORDER ) / sizeof( LAYER_NUM ); ++i )
130  {
131  LAYER_NUM layer = SCH_LAYER_ORDER[i];
132  wxASSERT( layer < KIGFX::VIEW::VIEW_MAX_LAYERS );
133 
134  m_view->SetLayerOrder( layer, i );
135  }
136 }
137 
138 
140 {
141  bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType );
144 
145  Refresh();
146 
147  return rv;
148 }
149 
150 
152 {
153  // caching makes no sense for Cairo and other software renderers
155 
156  for( int i = 0; i < KIGFX::VIEW::VIEW_MAX_LAYERS; i++ )
157  m_view->SetLayerTarget( i, target );
158 
159  // Bitmaps are draw on a non cached GAL layer:
161 
162  // Some draw layers need specific settings
165 
168 
171 
172 // m_view->SetLayerTarget( LAYER_SELECTION_SHADOWS, KIGFX::TARGET_NONCACHED );
173 // m_view->SetLayerDisplayOnly( LAYER_SELECTION_SHADOWS ) ;
174 }
175 
176 
178 {
179  return static_cast<KIGFX::SCH_VIEW*>( m_view );
180 }
181 
182 
184 {
185  SCH_BASE_FRAME* frame = dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() );
186 
187  try
188  {
189  // Check if the current rendering backend can be properly initialized
190  m_view->UpdateItems();
191  }
192  catch( const std::runtime_error& e )
193  {
194  DisplayInfoMessage( frame, e.what() );
195 
196  // Use fallback if one is available
197  if( GAL_FALLBACK != m_backend )
198  {
200 
201  if( frame )
202  frame->ActivateGalCanvas();
203  }
204  }
205 }
206 
207 
208 void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
209 {
210  // The first wxPaintEvent can be fired at startup before the GAL engine is fully initialized
211  // (depending on platforms). Do nothing in this case
212  if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
213  return;
214 
215  EDA_DRAW_PANEL_GAL::onPaint( aEvent );
216 }
void SetScaleLimits(double aMaximum, double aMinimum)
Set minimum and maximum values for scale.
Definition: view.h:303
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void SetClearColor(const COLOR4D &aColor)
void DisplayComponent(LIB_PART *aComponent)
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
void DisplayComponent(LIB_PART *aPart)
Definition: sch_view.cpp:121
void SetLayerOrder(int aLayer, int aRenderingOrder)
Set rendering order of a particular layer.
Definition: view.cpp:639
GAL_TYPE m_backend
Currently used GAL.
This file is part of the common library.
void OnShow() override
Called when the window is shown for the first time.
to handle and draw images bitmaps
An implementation of class VIEW_CONTROLS for wxWidgets library.
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
void Cleanup()
Definition: sch_view.cpp:64
static constexpr GAL_TYPE GAL_FALLBACK
void UpdateAllLayersOrder()
Do everything that is needed to apply the rendering order of layers.
Definition: view.cpp:899
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition: view.cpp:540
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
WX_VIEW_CONTROLS class definition.
static constexpr int VIEW_MAX_LAYERS
maximum number of layers that may be shown
Definition: view.h:700
Auxiliary rendering target (noncached)
Definition: definitions.h:49
static const LAYER_NUM SCH_LAYER_ORDER[]
Definition: sch_view.h:46
void SetLayerTarget(int aLayer, RENDER_TARGET aTarget)
Change the rendering target for a particular layer.
Definition: view.h:426
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent))
void DisplaySheet(SCH_SCREEN *aScreen)
void DisplaySheet(const SCH_SCREEN *aScreen)
Definition: sch_view.cpp:92
void Clear()
Remove all items from the view.
Definition: view.cpp:1083
#define ZOOM_MAX_LIMIT_EESCHEMA
Definition: zoom_defines.h:47
std::unique_ptr< KIGFX::PAINTER > m_painter
Contains information about how to draw items using GAL.
void SetLayerDisplayOnly(int aLayer, bool aDisplayOnly=true)
Definition: view.h:414
SCH_PAINTER Contains methods for drawing schematic-specific items.
Definition: sch_painter.h:136
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent)) override
Called when the window is shown for the first time.
Define a library symbol object.
Definition: lib_symbol.h:93
Items that may change while the view stays the same (noncached)
Definition: definitions.h:50
virtual void SetFocus() override
void UpdateItems()
Iterate through the list of items that asked for updating and updates them.
Definition: view.cpp:1389
void setDefaultLayerDeps()
Set rendering targets & dependencies for layers.
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void StartDrawing()
Begin drawing if it was stopped previously.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
bool SwitchBackend(GAL_TYPE aGalType) override
Switch method of rendering graphics.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=NULL) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
#define ZOOM_MIN_LIMIT_EESCHEMA
Definition: zoom_defines.h:48
SCH_DRAW_PANEL(wxWindow *aParentWindow, wxWindowID aWindowId, const wxPoint &aPosition, const wxSize &aSize, KIGFX::GAL_DISPLAY_OPTIONS &aOptions, GAL_TYPE aGalType=GAL_TYPE_OPENGL)
int LAYER_NUM
This can be replaced with int and removed.
see class PGM_BASE
Board layer functions and definitions.
Main rendering target (cached)
Definition: definitions.h:48
constexpr double SCH_WORLD_UNIT(1e-7/0.0254)
KIGFX::VIEW * m_view
Stores view settings (scale, center, etc.) and items to be drawn.
EDA_DRAW_FRAME * GetParentEDAFrame() const
Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
virtual bool IsVisible() const
Return true if the GAL canvas is visible on the screen.
currently selected items overlay
void SetPainter(PAINTER *aPainter)
Set the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:197
Color settings are a bit different than most of the settings objects in that there can be more than o...
drawingsheet frame and titleblock
wxCursor m_currentCursor
Current mouse cursor shape id.
void SetGAL(GAL *aGal)
Assign a rendering device for the VIEW.
Definition: view.cpp:494
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:281
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
void setDefaultLayerOrder()
Reassign layer order to the initial settings.
virtual bool IsInitialized() const
Return the initialization status for the canvas.