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 
52 
53 SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId,
54  const wxPoint& aPosition, const wxSize& aSize,
55  KIGFX::GAL_DISPLAY_OPTIONS& aOptions, GAL_TYPE aGalType ) :
56  EDA_DRAW_PANEL_GAL( aParentWindow, aWindowId, aPosition, aSize, aOptions, aGalType ),
57  m_parent( aParentWindow )
58 {
59  m_currentCursor = wxCURSOR_ARROW;
60  m_view = new KIGFX::SCH_VIEW( true, dynamic_cast<SCH_BASE_FRAME*>( aParentWindow ) );
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*>( aParentWindow ) )
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  m_view->SetScaleLimits( 1000.0, 0.0001 ); // This fixes the zoom in and zoom out limits
79  m_view->SetMirror( false, false );
80 
81  // Early initialization of the canvas background color,
82  // before any OnPaint event is fired for the canvas using a wrong bg color
83  auto settings = m_painter->GetSettings();
84  m_gal->SetClearColor( settings->GetBackgroundColor() );
85 
88 
90 
91  // View controls is the first in the event handler chain, so the Tool Framework operates
92  // on updated viewport data.
94 
95  m_viewControls->SetSnapping( true );
96 
97  SetEvtHandlerEnabled( true );
98  SetFocus();
99  Show( true );
100  Raise();
101  StartDrawing();
102 }
103 
104 
106 {
107 }
108 
109 
111 {
112  GetView()->Clear();
113  GetView()->DisplayComponent( const_cast<LIB_PART*>(aComponent) );
114 
115 }
116 
117 
119 {
120  GetView()->Clear();
121 
122  if( aScreen )
123  GetView()->DisplaySheet( const_cast<SCH_SCREEN*>( aScreen ) );
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  VECTOR2D grid_size = m_gal->GetGridSize();
142  bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType );
145 
146  // Keep grid size and grid visibility:
147  m_gal->SetGridSize( grid_size );
148  SCH_BASE_FRAME* frame = dynamic_cast<SCH_BASE_FRAME*>( GetParent() );
149 
150  if( frame )
152 
153  Refresh();
154 
155  return rv;
156 }
157 
158 
160 {
161  // caching makes no sense for Cairo and other software renderers
163 
164  for( int i = 0; i < KIGFX::VIEW::VIEW_MAX_LAYERS; i++ )
165  m_view->SetLayerTarget( i, target );
166 
167  // Bitmaps are draw on a non cached GAL layer:
169 
170  // Some draw layers need specific settings
173 
176 
179 
180 // m_view->SetLayerTarget( LAYER_SELECTION_SHADOWS, KIGFX::TARGET_NONCACHED );
181 // m_view->SetLayerDisplayOnly( LAYER_SELECTION_SHADOWS ) ;
182 }
183 
184 
186 {
187  return static_cast<KIGFX::SCH_VIEW*>( m_view );
188 }
189 
190 
192 {
193  SCH_BASE_FRAME* frame = dynamic_cast<SCH_BASE_FRAME*>( GetParent() );
194 
195  try
196  {
197  // Check if the current rendering backend can be properly initialized
198  m_view->UpdateItems();
199  }
200  catch( const std::runtime_error& e )
201  {
202  // Fallback to software renderer
203  DisplayInfoMessage( frame, e.what() );
205 
206  if( frame )
207  frame->ActivateGalCanvas();
208  }
209 }
210 
211 
212 void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
213 {
214  // The first wxPaintEvent can be fired at startup before the GAL engine is fully initialized
215  // (depending on platforms). Do nothing in this case
216  if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
217  return;
218 
219  EDA_DRAW_PANEL_GAL::onPaint( aEvent );
220 }
void DisplaySheet(const SCH_SCREEN *aScreen)
void SetScaleLimits(double aMaximum, double aMinimum)
Function SetScaleLimits() Sets minimum and maximum values for scale.
Definition: view.h:298
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
KIGFX::SCH_VIEW * GetView() const override
Function GetView() Returns a pointer to the VIEW instance used in the panel.
void SetClearColor(const COLOR4D &aColor)
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:103
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
void DisplayComponent(LIB_PART *aPart)
Definition: sch_view.cpp:128
void SetLayerOrder(int aLayer, int aRenderingOrder)
Function SetLayerOrder() Sets rendering order of a particular layer.
Definition: view.cpp:664
GAL_TYPE m_backend
Currently used GAL.
This file is part of the common library.
void OnShow() override
to handle and draw images bitmaps
WX_VIEW_CONTROLS is a specific implementation of class VIEW_CONTROLS for wxWidgets library.
VIEW_CONTROLS class definition.
virtual bool SwitchBackend(GAL_TYPE aGalType)
Function SwitchBackend Switches method of rendering graphics.
virtual bool IsGridVisible() const
virtual void SetSnapping(bool aEnabled)
Function SetSnapping() Enables/disables snapping cursor to grid.
void DisplaySheet(SCH_SHEET *aSheet)
Definition: sch_view.cpp:122
void UpdateAllLayersOrder()
Function UpdateLayerOrder() Does everything that is needed to apply the rendering order of layers.
Definition: view.cpp:927
void SetMirror(bool aMirrorX, bool aMirrorY)
Function SetMirror() Controls the mirroring of the VIEW.
Definition: view.cpp:565
WX_VIEW_CONTROLS class definition.
static constexpr int VIEW_MAX_LAYERS
maximum number of layers that may be shown
Definition: view.h:701
Auxiliary rendering target (noncached)
Definition: definitions.h:49
static const LAYER_NUM SCH_LAYER_ORDER[]
Definition: sch_view.h:44
void SetLayerTarget(int aLayer, RENDER_TARGET aTarget)
Function SetLayerTarget() Changes the rendering target for a particular layer.
Definition: view.h:434
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent))
void Clear()
Function Clear() Removes all items from the view.
Definition: view.cpp:1111
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:422
SCH_PAINTER Contains methods for drawing schematic-specific items.
Definition: sch_painter.h:117
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent)) override
Define a library symbol object.
Items that may change while the view stays the same (noncached)
Definition: definitions.h:50
virtual void SetFocus() override
void UpdateItems()
Function UpdateItems() Iterates through the list of items that asked for updating and updates them.
Definition: view.cpp:1421
void setDefaultLayerDeps()
Reassigns layer order to the initial settings.
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void SetGridSize(const VECTOR2D &aGridSize)
Set the grid size.
void StartDrawing()
Function StartDrawing() Begins drawing if it was stopped previously.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
bool SwitchBackend(GAL_TYPE aGalType) override
Function SwitchBackend Switches 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...
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
Type LAYER_NUM can be replaced with int and removed.
const VECTOR2D & GetGridSize() const
Returns the grid size.
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.
virtual bool IsVisible() const
Returns true if the GAL canvas is visible on the screen.
currently selected items overlay
void SetGridVisibility(bool aVisibility)
Sets the visibility setting of the grid.
void SetPainter(PAINTER *aPainter)
Function SetPainter() Sets the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:189
void SetGAL(GAL *aGal)
Function SetGAL() Assigns a rendering device for the VIEW.
Definition: view.cpp:519
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:267
A shim class between EDA_DRAW_FRAME and several derived classes: LIB_EDIT_FRAME, LIB_VIEW_FRAME,...
void DisplayComponent(const LIB_PART *aComponent)
void setDefaultLayerOrder()
virtual bool IsInitialized() const
Returns the initalization status for the canvas.