KiCad PCB EDA Suite
Loading...
Searching...
No Matches
panel_board_stackup.h
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) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef PANEL_SETUP_BOARD_STACKUP_H
26#define PANEL_SETUP_BOARD_STACKUP_H
27
28
29#include <board.h>
30#include <widgets/unit_binder.h>
31#include <wx/gdicmn.h>
32
34#include "board_stackup.h"
36#include "dielectric_material.h"
37
38class wxBitmapComboBox;
41
42
43// A helper class to handle UI items managed by m_fgGridSizer
44// in PANEL_SETUP_BOARD_STACKUP
45// these items are shown or not in m_fgGridSizer, depending on
46// the enabled layers in the current board.
47// So we need to store the list of these UI items int m_fgGridSizer
48// row by row
50{
51 BOARD_STACKUP_ITEM* m_Item; // The BOARD_STACKUP_ITEM managed by this BOARD_STACKUP_ROW_UI_ITEM
52 int m_SubItem; // For multilayer dielectric, the index in sublayer list.
53 // Must be >= 0 and < m_Item sublayer count. Used only for dielectic
54 // 0 is the base list of parameters (always existing)
55 int m_Row; // The row number in the parent grid
56 bool m_isEnabled; // True if the row is in board
57 // false if not (this row is not shown on the panel)
58 wxStaticBitmap* m_Icon; // Color icon in first column (column 1)
59 wxStaticText* m_LayerName; // string shown in column 2
60 wxControl* m_LayerTypeCtrl; // control shown in column 3
61 wxControl* m_MaterialCtrl; // control shown in column 4, with m_MaterialButt
62 wxButton* m_MaterialButt; // control shown in column 4, with m_MaterialCtrl
63 wxControl* m_ThicknessCtrl; // control shown in column 5
64 wxControl* m_ThicknessLockCtrl; // control shown in column 6
65 wxControl* m_ColorCtrl; // control shown in column 7
66 wxControl* m_EpsilonCtrl; // control shown in column 8
67 wxControl* m_LossTgCtrl; // control shown in column 9
68 wxControl* m_SpecFreqCtrl; // control shown in column 10
69 wxControl* m_SpecFreqUnitsCtrl; // control shown in column 11
70 wxControl* m_DielectricModelCtrl; // control shown in column 12
71
72 COLOR4D m_UserColor; // User-specified color (if any)
73
74 BOARD_STACKUP_ROW_UI_ITEM( BOARD_STACKUP_ITEM* aItem, int aSubItem, int aRow ) :
75 m_Item( aItem ),
76 m_SubItem( aSubItem ),
77 m_Row( aRow ),
78 m_isEnabled( false ),
79 m_Icon( nullptr ),
80 m_LayerName( nullptr ),
81 m_LayerTypeCtrl( nullptr ),
82 m_MaterialCtrl( nullptr ),
83 m_MaterialButt( nullptr ),
84 m_ThicknessCtrl( nullptr ),
85 m_ThicknessLockCtrl( nullptr ),
86 m_ColorCtrl( nullptr ),
87 m_EpsilonCtrl( nullptr ),
88 m_LossTgCtrl( nullptr ),
89 m_SpecFreqCtrl( nullptr ),
90 m_SpecFreqUnitsCtrl( nullptr ),
91 m_DielectricModelCtrl( nullptr )
92 {}
93};
94
95
97{
98public:
99 PANEL_SETUP_BOARD_STACKUP( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
100 PANEL_SETUP_LAYERS* aPanelLayers,
101 PANEL_SETUP_BOARD_FINISH* aPanelFinish );
103
104 void ImportSettingsFrom( BOARD* aBoard );
105
112 void OnLayersOptionsChanged( const LSET& aNewLayerSet );
113
115 int GetCopperLayerCount() const;
116
120 int GetSublayerId( int aRow );
121
123 wxColor GetSelectedColor( int aRow ) const;
124
125 // Called by wxWidgets: transfer current settings stored in m_stackup to the board
126 bool TransferDataFromWindow() override;
127
128private:
138 void lazyBuildRowUI( BOARD_STACKUP_ROW_UI_ITEM& ui_row_item, int aPos );
139
142 wxControl* addSpacer( int aPos );
143
153 void buildLayerStackPanel( bool aCreateInitialStackup = false, bool aRelinkStackup = false );
154
160 void synchronizeWithBoard( bool aFullSync );
161
168
175 void rebuildLayerStackPanel( bool aRelinkItems = false );
176
180
185
191
196 void setDefaultLayerWidths( int targetThickness );
197
198 void onColorSelected( wxCommandEvent& event );
199 void onMaterialChange( wxCommandEvent& event );
200 void onThicknessChange( wxCommandEvent& event );
201 void onExportToClipboard( wxCommandEvent& event ) override;
202 void onAddDielectricLayer( wxCommandEvent& event ) override;
203 void onRemoveDielectricLayer( wxCommandEvent& event ) override;
204 void onRemoveDielUI( wxUpdateUIEvent& event ) override;
205 void onCopperLayersSelCount( wxCommandEvent& event ) override;
206 void onAdjustDielectricThickness( wxCommandEvent& event ) override;
207
212 void updateIconColor( int aRow = -1 );
213
219 wxColor getColorIconItem( int aRow );
220
228 wxBitmapComboBox* createColorBox( BOARD_STACKUP_ITEM* aStackupItem, int aRow );
229
230 void onUnitsChanged( wxCommandEvent& event );
231
235 void disconnectEvents();
236
240 static wxString m_specFreqChoices[4];
241
245 static wxString m_dielecticModelChoices[2];
246
248 enum class FREQ_UNITS : int
249 {
250 HZ = 0,
254 };
255
259 static std::pair<double, FREQ_UNITS> normaliseFrequency( double aFreq );
260
261private:
263 PANEL_SETUP_LAYERS* m_panelLayers; // The associated PANEL_SETUP_LAYERS, to know enabled
264 // layers and copper layer names
265 LSET m_enabledLayers; // The current enabled layers in this panel restricted
266 // to allowed layers in stackup. (When this doesn't
267 // match the enabled layers in PANEL_SETUP_LAYERS the
268 // stackup is not up to date.)
270
271 DIELECTRIC_SUBSTRATE_LIST m_delectricMatList; // List of currently available
272 // dielectric materials
273 DIELECTRIC_SUBSTRATE_LIST m_solderMaskMatList; // List of currently available
274 // solder mask materials
275 DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList; // List of currently available
276 // solder mask materials
277 std::vector<BOARD_STACKUP_ROW_UI_ITEM> m_rowUiItemsList; // List of items in m_fgGridSizer
278
283 wxSize m_numericTextCtrlSize; // Best size for wxTextCtrls with units
284 wxSize m_numericFieldsSize; // Best size for wxTextCtrls without units
285 wxSize m_unitsFieldsSize; // Best size for wxChoice units selection
286 wxSize m_modelFieldSize; // Best size for dielectric model selection
287 wxArrayString m_core_prepreg_choice; // Used to display the option list in dialog
288 wxSize m_colorSwatchesSize; // Size of swatches in the wxBitmapComboBox.
289 wxSize m_colorIconsSize; // Size of swatches in the grid (left column)
290
291 std::vector<wxControl*> m_controlItemsList; // List of ctrls (wxChoice, wxTextCtrl, etc.)
292 // with added event handlers
293};
294
295#endif // #ifndef PANEL_SETUP_BOARD_STACKUP_H
Container for design settings for a BOARD object.
Manage one layer needed to make a physical board.
Manage layers needed to make a physical board.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
PANEL_SETUP_BOARD_STACKUP_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
static wxString m_dielecticModelChoices[2]
The choices available for dielectric frequency-dependency model.
void onAddDielectricLayer(wxCommandEvent &event) override
FREQ_UNITS
Describes the displayed units for a normalised frequency.
DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList
void onExportToClipboard(wxCommandEvent &event) override
bool transferDataFromUIToStackup()
Transfer current UI settings to m_stackup but not to the board.
PANEL_SETUP_BOARD_STACKUP(wxWindow *aParentWindow, PCB_EDIT_FRAME *aFrame, PANEL_SETUP_LAYERS *aPanelLayers, PANEL_SETUP_BOARD_FINISH *aPanelFinish)
std::vector< wxControl * > m_controlItemsList
void onColorSelected(wxCommandEvent &event)
void onCopperLayersSelCount(wxCommandEvent &event) override
void onUnitsChanged(wxCommandEvent &event)
void ImportSettingsFrom(BOARD *aBoard)
PANEL_SETUP_BOARD_FINISH * m_panelFinish
void updateIconColor(int aRow=-1)
Update the icons color (swatches in first grid column)
static std::pair< double, FREQ_UNITS > normaliseFrequency(double aFreq)
Normalises a frequency in Hz to a value and a units multiplier.
void updateCopperLayerCount()
Updates the enabled copper layers when the dropdown is changed.
wxColor GetSelectedColor(int aRow) const
Return the color currently selected for the row aRow.
void onRemoveDielectricLayer(wxCommandEvent &event) override
wxControl * addSpacer(int aPos)
add a Spacer in m_fgGridSizer when a empty cell is needed
int computeBoardThickness()
Recompute the board thickness and update the textbox.
void setDefaultLayerWidths(int targetThickness)
Set the widths of dielectric layers to sensible defaults.
static wxString m_specFreqChoices[4]
The choices available for spec freq units.
void synchronizeWithBoard(bool aFullSync)
Synchronize the full stackup shown in m_fgGridSizer according to the stackup of the current board and...
void buildLayerStackPanel(bool aCreateInitialStackup=false, bool aRelinkStackup=false)
Populate m_fgGridSizer with items to handle stackup parameters This is a full list: all copper layers...
void onThicknessChange(wxCommandEvent &event)
BOARD_DESIGN_SETTINGS * m_brdSettings
BOARD_STACKUP_ITEM * GetStackupItem(int aRow)
void showOnlyActiveLayers()
Show or do not show items in m_fgGridSizer according to the stackup of the current board.
DIELECTRIC_SUBSTRATE_LIST m_solderMaskMatList
std::vector< BOARD_STACKUP_ROW_UI_ITEM > m_rowUiItemsList
PANEL_SETUP_LAYERS * m_panelLayers
void onRemoveDielUI(wxUpdateUIEvent &event) override
void lazyBuildRowUI(BOARD_STACKUP_ROW_UI_ITEM &ui_row_item, int aPos)
Creates the controls in a BOARD_STACKUP_ROW_UI_ITEM relative to the aStackupItem.
DIELECTRIC_SUBSTRATE_LIST m_delectricMatList
wxBitmapComboBox * createColorBox(BOARD_STACKUP_ITEM *aStackupItem, int aRow)
creates a bitmap combobox to select a layer color
void disconnectEvents()
disconnect event handlers connected to wxControl items found in list m_controlItemsList
void onAdjustDielectricThickness(wxCommandEvent &event) override
void OnLayersOptionsChanged(const LSET &aNewLayerSet)
Must be called if the copper layers count has changed or solder mask, solder paste or silkscreen laye...
void onMaterialChange(wxCommandEvent &event)
void rebuildLayerStackPanel(bool aRelinkItems=false)
Populate m_fgGridSizer with items to handle stackup parameters If previous items are in list,...
The main frame for Pcbnew.
EDA_UNITS
Definition eda_units.h:48
BOARD_STACKUP_ROW_UI_ITEM(BOARD_STACKUP_ITEM *aItem, int aSubItem, int aRow)
BOARD_STACKUP_ITEM * m_Item