KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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-2023 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 <advanced_config.h>
27#include <base_units.h>
28#include <board.h>
29#include <footprint.h>
30#include <pad.h>
31#include <pcb_dimension.h>
32#include <dpi_scaling_common.h>
33#include <eda_draw_frame.h>
35#include <fp_lib_table.h>
37#include <kiway.h>
38#include <math/box2.h>
39#include <pcb_painter.h>
40#include <pcb_draw_panel_gal.h>
41#include <pcb_edit_frame.h>
42#include <pgm_base.h>
44#include <view/view.h>
45#include <wx/stattext.h>
46#include <zoom_defines.h>
47#include <dialog_shim.h>
48#include <project_pcb.h>
49
51 UNITS_PROVIDER* aUnitsProvider,
52 std::unique_ptr<KIGFX::GAL_DISPLAY_OPTIONS> aOpts,
53 GAL_TYPE aGalType ) :
54 PCB_DRAW_PANEL_GAL( aParent, -1, wxPoint( 0, 0 ), wxSize( 200, 200 ), *aOpts, aGalType ),
55 KIWAY_HOLDER( aKiway, KIWAY_HOLDER::PANEL ),
56 m_displayOptions( std::move( aOpts ) ),
57 m_currentFootprint( nullptr )
58{
59 SetStealsFocus( false );
60 ShowScrollbars( wxSHOW_SB_NEVER, wxSHOW_SB_NEVER );
61 EnableScrolling( false, false ); // otherwise Zoom Auto disables GAL canvas
62
63 m_userUnits = aUnitsProvider->GetUserUnits();
64
65 m_dummyBoard = std::make_unique<BOARD>();
66 m_dummyBoard->SetUserUnits( m_userUnits );
67 m_dummyBoard->SetBoardUse( BOARD_USE::FPHOLDER );
70
71 Raise();
72 Show( true );
74}
75
76
78{
80 {
82 GetView()->Clear();
83 m_currentFootprint->SetParent( nullptr );
84 }
85
87 {
89 GetView()->Clear();
90 m_otherFootprint->SetParent( nullptr );
91 }
92}
93
94
96{
97 KIGFX::PAINTER* painter = GetView()->GetPainter();
98 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
99
100 return settings->GetBackgroundColor();
101}
102
103
105{
106 KIGFX::PAINTER* painter = GetView()->GetPainter();
107 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
108
109 return settings->GetLayerColor( F_Fab );
110}
111
112
113void FOOTPRINT_PREVIEW_PANEL::renderFootprint( std::shared_ptr<FOOTPRINT> aFootprint )
114{
115 aFootprint->SetParent( m_dummyBoard.get() );
116
117 INSPECTOR_FUNC inspector =
118 [&]( EDA_ITEM* descendant, void* aTestData )
119 {
120 static_cast<PCB_DIMENSION_BASE*>( descendant )->UpdateUnits();
121 return INSPECT_RESULT::CONTINUE;
122 };
123
124 aFootprint->Visit( inspector, nullptr, { PCB_DIM_LEADER_T,
129
130 for( PAD* pad : aFootprint->Pads() )
131 pad->SetPinFunction( m_pinFunctions[ pad->GetNumber() ] );
132
133 // Ensure we are not using the high contrast mode to display the selected footprint
134 KIGFX::PAINTER* painter = GetView()->GetPainter();
135 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
136 settings->m_ContrastModeDisplay = HIGH_CONTRAST_MODE::NORMAL;
137
138 GetView()->Add( aFootprint.get() );
139 GetView()->SetVisible( aFootprint.get(), true );
140 GetView()->Update( aFootprint.get(), KIGFX::ALL );
141}
142
143
145{
146 BOX2I bbox = m_currentFootprint->GetBoundingBox( false, false );
147
148 if( bbox.GetSize().x > 0 && bbox.GetSize().y > 0 )
149 {
150 // Autozoom
151 GetView()->SetViewport( BOX2D( bbox.GetOrigin(), bbox.GetSize() ) );
152
153 // Add a margin
154 GetView()->SetScale( GetView()->GetScale() * 0.7 );
155
156 Refresh();
157 }
158}
159
160
162{
164 {
166 GetView()->Clear();
167 m_currentFootprint->SetParent( nullptr );
168 }
169
171
172 try
173 {
174 const FOOTPRINT* fp = fptbl->GetEnumeratedFootprint( aFPID.GetLibNickname(),
175 aFPID.GetLibItemName() );
176
177 if( fp )
178 m_currentFootprint.reset( static_cast<FOOTPRINT*>( fp->Duplicate() ) );
179 else
180 m_currentFootprint.reset();
181 }
182 catch( ... )
183 {
184 m_currentFootprint.reset();
185 }
186
188 {
191 }
192
193 ForceRefresh();
194
195 return m_currentFootprint != nullptr;
196}
197
198
199void FOOTPRINT_PREVIEW_PANEL::DisplayFootprints( std::shared_ptr<FOOTPRINT> aFootprintA,
200 std::shared_ptr<FOOTPRINT> aFootprintB )
201{
203 {
205 m_currentFootprint->SetParent( nullptr );
206
207 wxASSERT( m_otherFootprint );
208
209 GetView()->Remove( m_otherFootprint.get() );
210 m_otherFootprint->SetParent( nullptr );
211
212 GetView()->Clear();
213 }
214
215 m_currentFootprint = aFootprintA;
216 m_otherFootprint = aFootprintB;
217
219 {
220 wxASSERT( m_otherFootprint );
221
225 }
226
227 Layout();
228 Show();
229}
230
231
233{
235 ForceRefresh();
236}
237
238
240{
241 return static_cast<wxWindow*>( this );
242}
243
244
246 UNITS_PROVIDER* aUnitsProvider )
247{
248 PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
249
250 if( cfg->m_Window.grid.grids.empty() )
252
253 // Currently values read from config file are not used because the user cannot
254 // change this config
255 //if( cfg->m_Window.zoom_factors.empty() )
256 {
259 else
261 }
262
263 std::unique_ptr<GAL_DISPLAY_OPTIONS_IMPL> gal_opts;
264
265 gal_opts = std::make_unique<GAL_DISPLAY_OPTIONS_IMPL>();
266 gal_opts->ReadConfig( *Pgm().GetCommonSettings(), cfg->m_Window, aParent );
267
268 auto galType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
269 FOOTPRINT_PREVIEW_PANEL* panel = new FOOTPRINT_PREVIEW_PANEL( aKiway, aParent, aUnitsProvider,
270 std::move( gal_opts ), galType );
271
272 panel->UpdateColors();
273
274 const GRID_SETTINGS& gridCfg = cfg->m_Window.grid;
275
276 panel->GetGAL()->SetGridVisibility( gridCfg.show );
277
278 //Bounds checking cannot include number of elements as an index!
279 int gridIdx = alg::clamp( 0, gridCfg.last_size_idx, (int) gridCfg.grids.size() - 1 );
281 gridCfg.grids[gridIdx].x );
283 gridCfg.grids[gridIdx].y );
284 panel->GetGAL()->SetGridSize( VECTOR2D( gridSizeX, gridSizeY ) );
285
286 auto painter = static_cast<KIGFX::PCB_PAINTER*>( panel->GetView()->GetPainter() );
287 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
288 settings->SetHighlight( false );
289 settings->SetNetColorMode( NET_COLOR_MODE::OFF );
290
291 return panel;
292}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
@ OFF
Net (and netclass) colors are not shown.
BOX2< VECTOR2D > BOX2D
Definition: box2.h:854
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
WINDOW_SETTINGS m_Window
Definition: app_settings.h:170
const std::vector< GRID > DefaultGridSizeList() const
const Vec & GetOrigin() const
Definition: box2.h:184
const Vec & GetSize() const
Definition: box2.h:180
void ForceRefresh()
Force a redraw.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
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
virtual INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes)
May be re-implemented for each derived class in order to handle all the types given by its member dat...
Definition: eda_item.cpp:91
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.
virtual void DisplayFootprints(std::shared_ptr< FOOTPRINT > aFootprintA, std::shared_ptr< FOOTPRINT > aFootprintB) override
Display a pair of footprints.
std::map< wxString, wxString > m_pinFunctions
virtual void RefreshAll() override
Force the redrawing of all contents.
std::shared_ptr< FOOTPRINT > m_otherFootprint
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
static FOOTPRINT_PREVIEW_PANEL * New(KIWAY *aKiway, wxWindow *aParent, UNITS_PROVIDER *aUnitsProvider)
virtual const KIGFX::COLOR4D & GetForegroundColor() const override
FOOTPRINT_PREVIEW_PANEL(KIWAY *aKiway, wxWindow *aParent, UNITS_PROVIDER *aUnitsProvider, std::unique_ptr< KIGFX::GAL_DISPLAY_OPTIONS > aOpts, GAL_TYPE aGalType)
Create a new panel.
BOARD_ITEM * Duplicate() const override
Create a copy of this BOARD_ITEM.
Definition: footprint.cpp:2156
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
void SetGridSize(const VECTOR2D &aGridSize)
Set the grid size.
void SetGridVisibility(bool aVisibility)
Set the visibility setting of the grid.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition: painter.h:59
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Contains methods for drawing PCB-specific items.
Definition: pcb_painter.h:164
PCB specific render settings.
Definition: pcb_painter.h:77
const COLOR4D & GetBackgroundColor() const override
Return current background color settings.
Definition: pcb_painter.h:105
HIGH_CONTRAST_MODE m_ContrastModeDisplay
Definition: pcb_painter.h:131
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:75
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition: pcb_view.cpp:57
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition: pcb_view.cpp:66
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
void SetHighlight(bool aEnabled, int aNetcode=-1, bool aMulti=false)
Turns on/off highlighting.
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
Definition: view.cpp:552
void SetViewport(const BOX2D &aViewport)
Set the visible area of the VIEW.
Definition: view.cpp:524
void Clear()
Remove all items from the view.
Definition: view.cpp:1121
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1518
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:215
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1563
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:279
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
Definition: pad.h:59
Abstract dimension API.
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.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
EDA_UNITS GetUserUnits() const
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
bool m_HyperZoom
Slide the zoom steps over for debugging things "up close".
@ F_Fab
Definition: layer_ids.h:121
KICOMMON_API 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:565
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:58
T clamp(T min, T value, T max)
Definition: kicad_algo.h:205
STL namespace.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
see class PGM_BASE
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:119
std::vector< GRID > grids
Definition: grid_settings.h:66
GRID_SETTINGS grid
Definition: app_settings.h:81
std::vector< double > zoom_factors
Definition: app_settings.h:78
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:105
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:102
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:103
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:101
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:104
VECTOR2< double > VECTOR2D
Definition: vector2d.h:587
#define ZOOM_LIST_PCBNEW
Definition: zoom_defines.h:32
#define ZOOM_LIST_PCBNEW_HYPER
Definition: zoom_defines.h:35