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 (C) 2009-2023 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
69 COLOR4D m_UserColor; // User-specified color (if any)
70
71 BOARD_STACKUP_ROW_UI_ITEM( BOARD_STACKUP_ITEM* aItem, int aSubItem, int aRow ) :
72 m_Item( aItem ),
73 m_SubItem( aSubItem ),
74 m_Row( aRow ),
75 m_isEnabled( false ),
76 m_Icon( nullptr ),
77 m_LayerName( nullptr ),
78 m_LayerTypeCtrl( nullptr ),
79 m_MaterialCtrl( nullptr ),
80 m_MaterialButt( nullptr ),
81 m_ThicknessCtrl( nullptr ),
82 m_ThicknessLockCtrl( nullptr ),
83 m_ColorCtrl( nullptr ),
84 m_EpsilonCtrl( nullptr ),
85 m_LossTgCtrl( nullptr )
86 {}
87};
88
89
91{
92public:
93 PANEL_SETUP_BOARD_STACKUP( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
94 PANEL_SETUP_LAYERS* aPanelLayers,
95 PANEL_SETUP_BOARD_FINISH* aPanelFinish );
97
98 void ImportSettingsFrom( BOARD* aBoard );
99
106 void OnLayersOptionsChanged( LSET aNewLayerSet );
107
109 int GetCopperLayerCount() const;
110
114 int GetSublayerId( int aRow );
115
117 wxColor GetSelectedColor( int aRow ) const;
118
119 // Called by wxWidgets: transfer current settings stored in m_stackup to the board
120 bool TransferDataFromWindow() override;
121
122private:
132 void lazyBuildRowUI( BOARD_STACKUP_ROW_UI_ITEM& ui_row_item, int aPos );
133
136 wxControl* addSpacer( int aPos );
137
147 void buildLayerStackPanel( bool aCreateInitialStackup = false, bool aRelinkStackup = false );
148
154 void synchronizeWithBoard( bool aFullSync );
155
162
169 void rebuildLayerStackPanel( bool aRelinkItems = false );
170
174
179
185
190 void setDefaultLayerWidths( int targetThickness );
191
192 void onColorSelected( wxCommandEvent& event );
193 void onMaterialChange( wxCommandEvent& event );
194 void onThicknessChange( wxCommandEvent& event );
195 void onExportToClipboard( wxCommandEvent& event ) override;
196 void onAddDielectricLayer( wxCommandEvent& event ) override;
197 void onRemoveDielectricLayer( wxCommandEvent& event ) override;
198 void onRemoveDielUI( wxUpdateUIEvent& event ) override;
199 void onCopperLayersSelCount( wxCommandEvent& event ) override;
200 void onAdjustDielectricThickness( wxCommandEvent& event ) override;
201
206 void updateIconColor( int aRow = -1 );
207
213 wxColor getColorIconItem( int aRow );
214
222 wxBitmapComboBox* createColorBox( BOARD_STACKUP_ITEM* aStackupItem, int aRow );
223
224 void onUnitsChanged( wxCommandEvent& event );
225
229 void disconnectEvents();
230
231private:
233 PANEL_SETUP_LAYERS* m_panelLayers; // The associated PANEL_SETUP_LAYERS, to know enabled
234 // layers and copper layer names
235 LSET m_enabledLayers; // The current enabled layers in this panel restricted
236 // to allowed layers in stackup. (When this doesn't
237 // match the enabled layers in PANEL_SETUP_LAYERS the
238 // stackup is not up to date.)
240
241 DIELECTRIC_SUBSTRATE_LIST m_delectricMatList; // List of currently available
242 // dielectric materials
243 DIELECTRIC_SUBSTRATE_LIST m_solderMaskMatList; // List of currently available
244 // solder mask materials
245 DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList; // List of currently available
246 // solder mask materials
247 std::vector<BOARD_STACKUP_ROW_UI_ITEM> m_rowUiItemsList; // List of items in m_fgGridSizer
248
253 wxSize m_numericTextCtrlSize; // Best size for wxTextCtrls with units
254 wxSize m_numericFieldsSize; // Best size for wxTextCtrls without units
255 wxArrayString m_core_prepreg_choice; // Used to display the option list in dialog
256 wxSize m_colorSwatchesSize; // Size of swatches in the wxBitmapComboBox.
257 wxSize m_colorIconsSize; // Size of swatches in the grid (left column)
258
259 std::vector<wxControl*> m_controlItemsList; // List of ctrls (wxChoice, wxTextCtrl, etc.)
260 // with added event handlers
261};
262
263#endif // #ifndef PANEL_SETUP_BOARD_STACKUP_H
Container for design settings for a BOARD object.
Manage one layer needed to make a physical board.
Definition: board_stackup.h:96
Manage layers needed to make a physical board.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:36
Class PANEL_SETUP_BOARD_STACKUP_BASE.
void onAddDielectricLayer(wxCommandEvent &event) override
DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList
void onExportToClipboard(wxCommandEvent &event) override
bool transferDataFromUIToStackup()
Transfer current UI settings to m_stackup but not to the board.
std::vector< wxControl * > m_controlItemsList
void onColorSelected(wxCommandEvent &event)
void onCopperLayersSelCount(wxCommandEvent &event) override
void onUnitsChanged(wxCommandEvent &event)
void ImportSettingsFrom(BOARD *aBoard)
void OnLayersOptionsChanged(LSET aNewLayerSet)
Must be called if the copper layers count has changed or solder mask, solder paste or silkscreen laye...
PANEL_SETUP_BOARD_FINISH * m_panelFinish
void updateIconColor(int aRow=-1)
Update the icons color (swatches in first grid column)
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.
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 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:46
BOARD_STACKUP_ROW_UI_ITEM(BOARD_STACKUP_ITEM *aItem, int aSubItem, int aRow)
BOARD_STACKUP_ITEM * m_Item