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 The 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 <dialog_shim.h>
47#include <project_pcb.h>
48
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{
58 SetStealsFocus( false );
59 ShowScrollbars( wxSHOW_SB_NEVER, wxSHOW_SB_NEVER );
60 EnableScrolling( false, false ); // otherwise Zoom Auto disables GAL canvas
61
62 m_userUnits = aUnitsProvider->GetUserUnits();
63
64 m_dummyBoard = std::make_unique<BOARD>();
65 m_dummyBoard->SetUserUnits( m_userUnits );
66 m_dummyBoard->SetBoardUse( BOARD_USE::FPHOLDER );
69
70 Raise();
71 Show( true );
73}
74
75
77{
79}
80
81
83{
84 m_dummyBoard->DetachAllFootprints();
85
88
91
92 GetView()->Clear();
93
94 m_currentFootprint = nullptr;
95 m_otherFootprint = nullptr;
96}
97
98
100{
101 KIGFX::PAINTER* painter = GetView()->GetPainter();
102 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
103
104 return settings->GetBackgroundColor();
105}
106
107
109{
110 KIGFX::PAINTER* painter = GetView()->GetPainter();
111 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
112
113 return settings->GetLayerColor( F_Fab );
114}
115
116
117void FOOTPRINT_PREVIEW_PANEL::renderFootprint( std::shared_ptr<FOOTPRINT> aFootprint )
118{
119 m_dummyBoard->Add( aFootprint.get() );
120
121 INSPECTOR_FUNC inspector =
122 [&]( EDA_ITEM* descendant, void* aTestData )
123 {
124 static_cast<PCB_DIMENSION_BASE*>( descendant )->UpdateUnits();
125 return INSPECT_RESULT::CONTINUE;
126 };
127
128 aFootprint->Visit( inspector, nullptr, { PCB_DIM_LEADER_T,
133
134 for( PAD* pad : aFootprint->Pads() )
135 pad->SetPinFunction( m_pinFunctions[ pad->GetNumber() ] );
136
137 // Ensure we are not using the high contrast mode to display the selected footprint
138 KIGFX::PAINTER* painter = GetView()->GetPainter();
139 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
140 settings->m_ContrastModeDisplay = HIGH_CONTRAST_MODE::NORMAL;
141
142 GetView()->Add( aFootprint.get() );
143 GetView()->SetVisible( aFootprint.get(), true );
144 GetView()->Update( aFootprint.get(), KIGFX::ALL );
145}
146
147
149{
150 bool includeText = m_currentFootprint->TextOnly();
151 BOX2I bbox = m_currentFootprint->GetBoundingBox( includeText );
152
153 if( bbox.GetSize().x > 0 && bbox.GetSize().y > 0 )
154 {
155 // Autozoom
156 GetView()->SetViewport( BOX2D( bbox.GetOrigin(), bbox.GetSize() ) );
157
158 // Add a margin
159 GetView()->SetScale( GetView()->GetScale() * 0.7 );
160
161 Refresh();
162 }
163}
164
165
167{
168 m_dummyBoard->DetachAllFootprints();
169
172
173 GetView()->Clear();
174
176
177 try
178 {
179 const FOOTPRINT* fp = fptbl->GetEnumeratedFootprint( aFPID.GetLibNickname(), aFPID.GetLibItemName() );
180
181 if( fp )
182 m_currentFootprint.reset( static_cast<FOOTPRINT*>( fp->Duplicate( IGNORE_PARENT_GROUP ) ) );
183 else
184 m_currentFootprint.reset();
185 }
186 catch( ... )
187 {
188 m_currentFootprint.reset();
189 }
190
192 {
195 }
196
197 ForceRefresh();
198
199 return m_currentFootprint != nullptr;
200}
201
202
203void FOOTPRINT_PREVIEW_PANEL::DisplayFootprints( std::shared_ptr<FOOTPRINT> aFootprintA,
204 std::shared_ptr<FOOTPRINT> aFootprintB )
205{
206 m_dummyBoard->DetachAllFootprints();
207
210
211 if( m_otherFootprint )
212 GetView()->Remove( m_otherFootprint.get() );
213
214 GetView()->Clear();
215
216 m_currentFootprint = aFootprintA;
217 m_otherFootprint = aFootprintB;
218
220 {
221 wxASSERT( m_otherFootprint );
222
226 }
227
228 Layout();
229 Show();
230}
231
232
234{
236 ForceRefresh();
237}
238
239
241 UNITS_PROVIDER* aUnitsProvider )
242{
244 COMMON_SETTINGS* commonSettings = Pgm().GetCommonSettings();
245 std::unique_ptr<GAL_DISPLAY_OPTIONS_IMPL> gal_opts;
246
247 gal_opts = std::make_unique<GAL_DISPLAY_OPTIONS_IMPL>();
248 gal_opts->ReadConfig( *commonSettings, cfg->m_Window, aParent );
249
250 auto galType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( commonSettings->m_Graphics.canvas_type );
251 FOOTPRINT_PREVIEW_PANEL* panel = new FOOTPRINT_PREVIEW_PANEL( aKiway, aParent, aUnitsProvider,
252 std::move( gal_opts ), galType );
253
254 panel->UpdateColors();
255
256 const GRID_SETTINGS& gridCfg = cfg->m_Window.grid;
257
258 panel->GetGAL()->SetGridVisibility( gridCfg.show );
259
260 //Bounds checking cannot include number of elements as an index!
261 int gridIdx = std::clamp( gridCfg.last_size_idx, 0, (int) gridCfg.grids.size() - 1 );
262 double gridSizeX = EDA_UNIT_UTILS::UI::DoubleValueFromString( pcbIUScale, EDA_UNITS::MILS,
263 gridCfg.grids[gridIdx].x );
264 double gridSizeY = EDA_UNIT_UTILS::UI::DoubleValueFromString( pcbIUScale, EDA_UNITS::MILS,
265 gridCfg.grids[gridIdx].y );
266 panel->GetGAL()->SetGridSize( VECTOR2D( gridSizeX, gridSizeY ) );
267
268 auto painter = static_cast<KIGFX::PCB_PAINTER*>( panel->GetView()->GetPainter() );
269 auto settings = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
270 settings->SetHighlight( false );
271 settings->SetNetColorMode( NET_COLOR_MODE::OFF );
272
273 return panel;
274}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:112
BOX2< VECTOR2D > BOX2D
Definition: box2.h:923
WINDOW_SETTINGS m_Window
Definition: app_settings.h:233
constexpr const Vec & GetOrigin() const
Definition: box2.h:210
constexpr const SizeVec & GetSize() const
Definition: box2.h:206
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:98
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:127
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
void DisplayFootprints(std::shared_ptr< FOOTPRINT > aFootprintA, std::shared_ptr< FOOTPRINT > aFootprintB) override
Display a pair of footprints.
std::map< wxString, wxString > m_pinFunctions
void RefreshAll() override
Force the redrawing of all contents.
std::shared_ptr< FOOTPRINT > m_otherFootprint
const KIGFX::COLOR4D & GetBackgroundColor() const override
Get the colors to use in a preview widget to match the preview panel.
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)
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(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const override
Create a copy of this BOARD_ITEM.
Definition: footprint.cpp:2623
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:182
PCB specific render settings.
Definition: pcb_painter.h:80
const COLOR4D & GetBackgroundColor() const override
Return current background color settings.
Definition: pcb_painter.h:120
HIGH_CONTRAST_MODE m_ContrastModeDisplay
Definition: pcb_painter.h:148
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:91
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:74
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:570
void SetViewport(const BOX2D &aViewport)
Set the visible area of the VIEW.
Definition: view.cpp:542
void Clear()
Remove all items from the view.
Definition: view.cpp:1143
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1561
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:220
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1612
A mix in class which holds the location of a wxWindow's KIWAY.
Definition: kiway_holder.h:39
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:286
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:54
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.
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:565
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
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:88
#define IGNORE_PARENT_GROUP
Definition: eda_item.h:55
@ F_Fab
Definition: layer_ids.h:119
KICOMMON_API double DoubleValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Convert aTextValue to a double.
Definition: eda_units.cpp:569
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:58
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:59
STL namespace.
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:902
see class PGM_BASE
std::vector< GRID > grids
Definition: grid_settings.h:66
GRID_SETTINGS grid
Definition: app_settings.h:97
@ 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:694