KiCad PCB EDA Suite
footprint_preview_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) 2016-2020 KiCad Developers, see AUTHORS.txt for contributors.
5 * Copyright (C) 2017 Chris Pavlina <[email protected]>
6 * Copyright (C) 2016 Tomasz Wlostowski <[email protected]>
7 *
8 * This program is free software: you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include <memory>
23#include <utility>
24
25#include "pcbnew_settings.h"
26#include <base_units.h>
27#include <board.h>
28#include <footprint.h>
29#include <pcb_dimension.h>
30#include <eda_draw_frame.h>
32#include <fp_lib_table.h>
33#include <kiway.h>
34#include <math/box2.h>
35#include <pcb_painter.h>
36#include <pcb_draw_panel_gal.h>
37#include <pcb_edit_frame.h>
38#include <pgm_base.h>
40#include <view/view.h>
41#include <wx/stattext.h>
42#include <zoom_defines.h>
43
45 std::unique_ptr<KIGFX::GAL_DISPLAY_OPTIONS> aOpts,
46 GAL_TYPE aGalType ) :
47 PCB_DRAW_PANEL_GAL( aParent, -1, wxPoint( 0, 0 ), wxSize( 200, 200 ), *aOpts, aGalType ),
48 KIWAY_HOLDER( aKiway, KIWAY_HOLDER::PANEL ),
49 m_displayOptions( std::move( aOpts ) ),
50 m_currentFootprint( nullptr )
51{
52 SetStealsFocus( false );
53 ShowScrollbars( wxSHOW_SB_NEVER, wxSHOW_SB_NEVER );
54 EnableScrolling( false, false ); // otherwise Zoom Auto disables GAL canvas
55
56 m_dummyBoard = std::make_unique<BOARD>();
59
60 Raise();
61 Show( true );
63}
64
65
67{
69 {
71 GetView()->Clear();
72 m_currentFootprint->SetParent( nullptr );
73 }
74}
75
76
78{
79 KIGFX::PAINTER* painter = GetView()->GetPainter();
80 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
81
82 return settings->GetBackgroundColor();
83}
84
85
87{
88 KIGFX::PAINTER* painter = GetView()->GetPainter();
89 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
90
91 return settings->GetLayerColor( F_Fab );
92}
93
94
95void FOOTPRINT_PREVIEW_PANEL::renderFootprint( std::shared_ptr<FOOTPRINT> aFootprint )
96{
98 {
100 GetView()->Clear();
101 m_currentFootprint->SetParent( nullptr );
102 }
103
104 m_currentFootprint = aFootprint;
105
106 if( !m_currentFootprint )
107 return;
108
109 m_currentFootprint->SetParent( m_dummyBoard.get() );
110
111 INSPECTOR_FUNC inspector =
112 [&]( EDA_ITEM* descendant, void* aTestData )
113 {
114 PCB_DIMENSION_BASE* dimension = static_cast<PCB_DIMENSION_BASE*>( descendant );
115
116 if( dimension->GetUnitsMode() == DIM_UNITS_MODE::AUTOMATIC )
117 {
118 dimension->SetUnits( m_userUnits );
119 dimension->Update();
120 }
121
123 };
124
125 m_currentFootprint->Visit( inspector, nullptr, { PCB_FP_DIM_LEADER_T,
129
130 // Ensure we are not using the high contrast mode to display the selected footprint
131 KIGFX::PAINTER* painter = GetView()->GetPainter();
132 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
134
135 GetView()->Add( m_currentFootprint.get() );
136 GetView()->SetVisible( m_currentFootprint.get(), true );
138
139 BOX2I bbox = m_currentFootprint->ViewBBox();
140 bbox.Merge( m_currentFootprint->Value().ViewBBox() );
141 bbox.Merge( m_currentFootprint->Reference().ViewBBox() );
142
143 if( bbox.GetSize().x > 0 && bbox.GetSize().y > 0 )
144 {
145 // Autozoom
146 GetView()->SetViewport( BOX2D( bbox.GetOrigin(), bbox.GetSize() ) );
147
148 // Add a margin
149 GetView()->SetScale( GetView()->GetScale() * 0.7 );
150
151 Refresh();
152 }
153}
154
155
157{
158 FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs();
159
160 try
161 {
162 const FOOTPRINT* fp = fptbl->GetEnumeratedFootprint( aFPID.GetLibNickname(),
163 aFPID.GetLibItemName() );
164
165 if( fp )
166 m_currentFootprint.reset( static_cast<FOOTPRINT*>( fp->Duplicate() ) );
167 else
168 m_currentFootprint.reset();
169 }
170 catch( ... )
171 {
172 m_currentFootprint.reset();
173 }
174
176 Refresh();
177
178 return m_currentFootprint != nullptr;
179}
180
181
183{
184 return static_cast<wxWindow*>( this );
185}
186
187
189{
190 PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
191
192 if( cfg->m_Window.grid.sizes.empty() )
194
195 // Currently values read from config file are not used because the user cannot
196 // change this config
197 //if( cfg->m_Window.zoom_factors.empty() )
198 {
200 }
201
202 std::unique_ptr<KIGFX::GAL_DISPLAY_OPTIONS> gal_opts;
203
204 gal_opts = std::make_unique<KIGFX::GAL_DISPLAY_OPTIONS>();
205 gal_opts->ReadConfig( *Pgm().GetCommonSettings(), cfg->m_Window, aParent );
206
207 auto canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
208 auto panel = new FOOTPRINT_PREVIEW_PANEL( aKiway, aParent, std::move( gal_opts ), canvasType );
209
210 panel->UpdateColors();
211
212 const GRID_SETTINGS& gridCfg = cfg->m_Window.grid;
213
214 panel->GetGAL()->SetGridVisibility( gridCfg.show );
215
216 //Bounds checking cannot include number of elements as an index!
217 int gridIdx = std::max( 0, std::min( gridCfg.last_size_idx, (int) gridCfg.sizes.size() - 1 ) );
219 gridCfg.sizes[ gridIdx ] );
220 panel->GetGAL()->SetGridSize( VECTOR2D( gridSize, gridSize ) );
221
222 return panel;
223}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
BOX2< VECTOR2D > BOX2D
Definition: box2.h:848
WINDOW_SETTINGS m_Window
Definition: app_settings.h:187
const std::vector< wxString > DefaultGridSizeList() const
const Vec & GetOrigin() const
Definition: box2.h:183
const Vec & GetSize() const
Definition: box2.h:179
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:588
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
void StartDrawing()
Begin drawing if it was stopped previously.
void SetStealsFocus(bool aStealsFocus)
Set whether focus is taken on certain events (mouseover, keys, etc).
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
Panel that renders a single footprint via Cairo GAL, meant to be exported through Kiface.
void renderFootprint(std::shared_ptr< FOOTPRINT > aFootprint)
std::shared_ptr< FOOTPRINT > m_currentFootprint
virtual wxWindow * GetWindow() override
Get the underlying wxWindow.
static FOOTPRINT_PREVIEW_PANEL * New(KIWAY *aKiway, wxWindow *aParent)
FOOTPRINT_PREVIEW_PANEL(KIWAY *aKiway, wxWindow *aParent, std::unique_ptr< KIGFX::GAL_DISPLAY_OPTIONS > aOpts, GAL_TYPE aGalType)
Create a new panel.
virtual const KIGFX::COLOR4D & GetBackgroundColor() const override
Get the colors to use in a preview widget to match the preview panel.
virtual bool DisplayFootprint(const LIB_ID &aFPID) override
Set the currently displayed footprint.
std::unique_ptr< BOARD > m_dummyBoard
virtual const KIGFX::COLOR4D & GetForegroundColor() const override
BOARD_ITEM * Duplicate() const override
Create a copy of this BOARD_ITEM.
Definition: footprint.cpp:1857
const FOOTPRINT * GetEnumeratedFootprint(const wxString &aNickname, const wxString &aFootprintName)
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition: painter.h:58
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
Definition: pcb_painter.h:72
const COLOR4D & GetBackgroundColor() const override
Return current background color settings.
Definition: pcb_painter.h:100
HIGH_CONTRAST_MODE m_ContrastModeDisplay
Definition: pcb_painter.h:125
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
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition: pcb_view.cpp:58
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition: pcb_view.cpp:75
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
Definition: view.cpp:551
void SetViewport(const BOX2D &aViewport)
Set the visible area of the VIEW.
Definition: view.cpp:523
void Clear()
Remove all items from the view.
Definition: view.cpp:1099
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1529
A mix in class which holds the location of a wxWindow's KIWAY.
Definition: kiway_holder.h:37
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:274
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
Abstract dimension API.
Definition: pcb_dimension.h:96
void Update()
Update the dimension's cached text and geometry.
void SetUnits(EDA_UNITS aUnits)
DIM_UNITS_MODE GetUnitsMode() const
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
virtual FP_LIB_TABLE * PcbFootprintLibs(KIWAY &aKiway)
Return the table of footprint libraries.
Definition: project.cpp:324
std::function< INSPECT_RESULT(EDA_ITEM *aItem, void *aTestData) > INSPECTOR_FUNC
Used to inspect and possibly collect the (search) results of iterating over a list or tree of KICAD_T...
Definition: eda_item.h:75
@ F_Fab
Definition: layer_ids.h:120
double DoubleValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Function DoubleValueFromString converts aTextValue to a double.
Definition: eda_units.cpp:456
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:53
Definition: bitmap.cpp:64
see class PGM_BASE
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111
Common grid settings, available to every frame.
Definition: app_settings.h:51
std::vector< wxString > sizes
Definition: app_settings.h:53
GRID_SETTINGS grid
Definition: app_settings.h:99
std::vector< double > zoom_factors
Definition: app_settings.h:96
@ PCB_FP_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:97
@ PCB_FP_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:99
@ PCB_FP_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:96
@ PCB_FP_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:98
VECTOR2< double > VECTOR2D
Definition: vector2d.h:617
#define ZOOM_LIST_PCBNEW
Definition: zoom_defines.h:32