KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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 <[email protected]>
6 * Copyright (C) 2019-2023 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>
41#include <layer_ids.h>
42#include <math/vector2d.h>
43#include <pgm_base.h>
45#include <view/view.h>
46#include <view/view_controls.h>
48
49#include <sch_base_frame.h>
50#include <sch_painter.h>
51#include <zoom_defines.h>
52
53
54SCH_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_view = new KIGFX::SCH_VIEW( dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() ) );
61
63
64 m_painter.reset( new KIGFX::SCH_PAINTER( m_gal ) );
65
66 COLOR_SETTINGS* cs = nullptr;
67
68 if( auto frame = dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() ) )
69 cs = frame->GetColorSettings();
70 else
72
73 wxASSERT( cs );
74 m_painter->GetSettings()->LoadColors( cs );
75
76 m_view->SetPainter( m_painter.get() );
77 // 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 SetEvtHandlerEnabled( true );
96 SetFocus();
97 Show( true );
98 Raise();
100}
101
102
104{
105}
106
107
109{
110 GetView()->DisplaySymbol( aSymbol );
111}
112
113
115{
116 GetView()->Clear();
117
118 if( aScreen )
119 GetView()->DisplaySheet( aScreen );
120 else
121 GetView()->Cleanup();
122}
123
124
126{
127 for( int i = 0; (unsigned) i < sizeof( SCH_LAYER_ORDER ) / sizeof( int ); ++i )
128 {
129 int layer = SCH_LAYER_ORDER[i];
130 wxASSERT( layer < KIGFX::VIEW::VIEW_MAX_LAYERS );
131
132 m_view->SetLayerOrder( layer, i );
133 }
134}
135
136
138{
139 bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType );
142
143 Refresh();
144
145 return rv;
146}
147
148
150{
151 // caching makes no sense for Cairo and other software renderers
153
154 for( int i = 0; i < KIGFX::VIEW::VIEW_MAX_LAYERS; i++ )
155 m_view->SetLayerTarget( i, target );
156
157 // Bitmaps are draw on a non cached GAL layer:
159
160 // Some draw layers need specific settings
163
166
169
174
177}
178
179
181{
182 return static_cast<KIGFX::SCH_VIEW*>( m_view );
183}
184
185
187{
188 SCH_BASE_FRAME* frame = dynamic_cast<SCH_BASE_FRAME*>( GetParentEDAFrame() );
189
190 try
191 {
192 // Check if the current rendering backend can be properly initialized
194 }
195 catch( const std::runtime_error& e )
196 {
197 DisplayInfoMessage( frame, e.what() );
198
199 // Use fallback if one is available
200 if( GAL_FALLBACK != m_backend )
201 {
203
204 if( frame )
205 frame->ActivateGalCanvas();
206 }
207 }
208}
209
210
211void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
212{
213 // The first wxPaintEvent can be fired at startup before the GAL engine is fully initialized
214 // (depending on platforms). Do nothing in this case
215 if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
216 return;
217
219}
Color settings are a bit different than most of the settings objects in that there can be more than o...
static constexpr GAL_TYPE GAL_FALLBACK
std::unique_ptr< KIGFX::PAINTER > m_painter
Contains information about how to draw items using GAL.
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent))
@ GAL_TYPE_OPENGL
OpenGL implementation.
KIGFX::VIEW * m_view
Stores view settings (scale, center, etc.) and items to be drawn.
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
void SetFocus() override
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
void StartDrawing()
Begin drawing if it was stopped previously.
GAL_TYPE m_backend
Currently used GAL.
EDA_DRAW_FRAME * GetParentEDAFrame() const
Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
void SetClearColor(const COLOR4D &aColor)
virtual bool IsInitialized() const
Return the initialization status for the canvas.
virtual bool IsVisible() const
Return true if the GAL canvas is visible on the screen.
Contains methods for drawing schematic-specific items.
Definition: sch_painter.h:68
void DisplaySymbol(LIB_SYMBOL *aSymbol)
Definition: sch_view.cpp:138
void DisplaySheet(const SCH_SCREEN *aScreen)
Definition: sch_view.cpp:95
void Cleanup()
Definition: sch_view.cpp:67
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition: view.cpp:549
void UpdateAllLayersOrder()
Do everything that is needed to apply the rendering order of layers.
Definition: view.cpp:896
void SetLayerDisplayOnly(int aLayer, bool aDisplayOnly=true)
Set a layer display-only (ie: to be rendered but not returned by hit test queries).
Definition: view.h:478
void SetPainter(PAINTER *aPainter)
Set the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:207
void SetGAL(GAL *aGal)
Assign a rendering device for the VIEW.
Definition: view.cpp:503
void SetLayerTarget(int aLayer, RENDER_TARGET aTarget)
Change the rendering target for a particular layer.
Definition: view.h:494
void Clear()
Remove all items from the view.
Definition: view.cpp:1127
static constexpr int VIEW_MAX_LAYERS
Rendering order modifier for layers that are marked as top layers.
Definition: view.h:742
void UpdateItems()
Iterate through the list of items that asked for updating and updates them.
Definition: view.cpp:1452
void SetScaleLimits(double aMaximum, double aMinimum)
Set minimum and maximum values for scale.
Definition: view.h:313
void SetLayerOrder(int aLayer, int aRenderingOrder)
Set rendering order of a particular layer.
Definition: view.cpp:648
An implementation of class VIEW_CONTROLS for wxWidgets library.
Define a library symbol object.
Definition: lib_symbol.h:78
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
bool SwitchBackend(GAL_TYPE aGalType) override
Switch method of rendering graphics.
void DisplaySymbol(LIB_SYMBOL *aSymbol)
void OnShow() override
Called when the window is shown for the first time.
void DisplaySheet(SCH_SCREEN *aScreen)
void setDefaultLayerOrder()
Reassign layer order to the initial settings.
SCH_DRAW_PANEL(wxWindow *aParentWindow, wxWindowID aWindowId, const wxPoint &aPosition, const wxSize &aSize, KIGFX::GAL_DISPLAY_OPTIONS &aOptions, GAL_TYPE aGalType=GAL_TYPE_OPENGL)
void setDefaultLayerDeps()
Set rendering targets & dependencies for layers.
virtual void onPaint(wxPaintEvent &WXUNUSED(aEvent)) override
Called when the window is shown for the first time.
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
This file is part of the common library.
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:218
@ LAYER_DRAW_BITMAPS
to handle and draw images bitmaps
Definition: layer_ids.h:224
@ LAYER_GP_OVERLAY
general purpose overlay
Definition: layer_ids.h:219
@ LAYER_SELECT_OVERLAY
currently selected items overlay
Definition: layer_ids.h:220
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:404
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:397
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:403
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition: definitions.h:38
@ TARGET_CACHED
Main rendering target (cached)
Definition: definitions.h:37
@ TARGET_OVERLAY
Items that may change while the view stays the same (noncached)
Definition: definitions.h:39
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
constexpr double SCH_WORLD_UNIT(1e-7/0.0254)
static const int SCH_LAYER_ORDER[]
Definition: sch_view.h:45
WX_VIEW_CONTROLS class definition.
#define ZOOM_MIN_LIMIT_EESCHEMA
Definition: zoom_defines.h:51
#define ZOOM_MAX_LIMIT_EESCHEMA
Definition: zoom_defines.h:50