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;
40
41
42// A helper class to handle UI items managed by m_fgGridSizer
43// in PANEL_SETUP_BOARD_STACKUP
44// these items are shown or not in m_fgGridSizer, depending on
45// the enabled layers in the current board.
46// So we need to store the list of these UI items int m_fgGridSizer
47// row by row
49{
50 BOARD_STACKUP_ITEM* m_Item; // The BOARD_STACKUP_ITEM managed by this BOARD_STACKUP_ROW_UI_ITEM
51 int m_SubItem; // For multilayer dielectric, the index in sublayer list.
52 // Must be >= 0 and < m_Item sublayer count. Used only for dielectic
53 // 0 is the base list of parameters (always existing)
54 int m_Row; // The row number in the parent grid
55 bool m_isEnabled; // True if the row is in board
56 // false if not (this row is not shown on the panel)
57 wxStaticBitmap* m_Icon; // Color icon in first column (column 1)
58 wxStaticText* m_LayerName; // string shown in column 2
59 wxControl* m_LayerTypeCtrl; // control shown in column 3
60 wxControl* m_MaterialCtrl; // control shown in column 4, with m_MaterialButt
61 wxButton* m_MaterialButt; // control shown in column 4, with m_MaterialCtrl
62 wxControl* m_ThicknessCtrl; // control shown in column 5
63 wxControl* m_ThicknessLockCtrl;// control shown in column 6
64 wxControl* m_ColorCtrl; // control shown in column 7
65 wxControl* m_EpsilonCtrl; // control shown in column 8
66 wxControl* m_LossTgCtrl; // control shown in column 9
67
68 COLOR4D m_UserColor; // User-specified color (if any)
69
70 BOARD_STACKUP_ROW_UI_ITEM( BOARD_STACKUP_ITEM* aItem, int aSubItem, int aRow ) :
71 m_Item( aItem ),
72 m_SubItem( aSubItem ),
73 m_Row( aRow ),
74 m_isEnabled( false ),
75 m_Icon( nullptr ),
76 m_LayerName( nullptr ),
77 m_LayerTypeCtrl( nullptr ),
78 m_MaterialCtrl( nullptr ),
79 m_MaterialButt( nullptr ),
80 m_ThicknessCtrl( nullptr ),
81 m_ThicknessLockCtrl( nullptr ),
82 m_ColorCtrl( nullptr ),
83 m_EpsilonCtrl( nullptr ),
84 m_LossTgCtrl( nullptr )
85 {}
86};
87
88
90{
91public:
92 PANEL_SETUP_BOARD_STACKUP( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
93 PANEL_SETUP_LAYERS* aPanelLayers );
95
96 void ImportSettingsFrom( BOARD* aBoard );
97
104 void OnLayersOptionsChanged( LSET aNewLayerSet );
105
107 int GetCopperLayerCount() const;
108
112 int GetSublayerId( int aRow );
113
115 wxColor GetSelectedColor( int aRow ) const;
116
117 // Called by wxWidgets: transfer current settings stored in m_stackup to the board
118 bool TransferDataFromWindow() override;
119
120private:
130 void lazyBuildRowUI( BOARD_STACKUP_ROW_UI_ITEM& ui_row_item, int aPos );
131
134 wxControl* addSpacer( int aPos );
135
145 void buildLayerStackPanel( bool aCreateInitialStackup = false, bool aRelinkStackup = false );
146
152 void synchronizeWithBoard( bool aFullSync );
153
160
167 void rebuildLayerStackPanel( bool aRelinkItems = false );
168
172
177
183
188 void setDefaultLayerWidths( int targetThickness );
189
190 void onColorSelected( wxCommandEvent& event );
191 void onMaterialChange( wxCommandEvent& event );
192 void onThicknessChange( wxCommandEvent& event );
193 void onExportToClipboard( wxCommandEvent& event ) override;
194 void onAddDielectricLayer( wxCommandEvent& event ) override;
195 void onRemoveDielectricLayer( wxCommandEvent& event ) override;
196 void onRemoveDielUI( wxUpdateUIEvent& event ) override;
197 void onCopperLayersSelCount( wxCommandEvent& event ) override;
198 void onAdjustDielectricThickness( wxCommandEvent& event ) override;
199
204 void updateIconColor( int aRow = -1 );
205
211 wxColor getColorIconItem( int aRow );
212
220 wxBitmapComboBox* createColorBox( BOARD_STACKUP_ITEM* aStackupItem, int aRow );
221
222 void onUnitsChanged( wxCommandEvent& event );
223
227 void disconnectEvents();
228
229private:
231 PANEL_SETUP_LAYERS* m_panelLayers; // The associated PANEL_SETUP_LAYERS, to know enabled
232 // layers and copper layer names
233 LSET m_enabledLayers; // The current enabled layers in this panel restricted
234 // to allowed layers in stackup. (When this doesn't
235 // match the enabled layers in PANEL_SETUP_LAYERS the
236 // stackup is not up to date.)
237
238 DIELECTRIC_SUBSTRATE_LIST m_delectricMatList; // List of currently available
239 // dielectric materials
240 DIELECTRIC_SUBSTRATE_LIST m_solderMaskMatList; // List of currently available
241 // solder mask materials
242 DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList; // List of currently available
243 // solder mask materials
244 std::vector<BOARD_STACKUP_ROW_UI_ITEM> m_rowUiItemsList; // List of items in m_fgGridSizer
245
250 wxSize m_numericTextCtrlSize; // Best size for wxTextCtrls with units
251 wxSize m_numericFieldsSize; // Best size for wxTextCtrls without units
252 wxArrayString m_core_prepreg_choice; // Used to display the option list in dialog
253 wxSize m_colorSwatchesSize; // Size of swatches in the wxBitmapComboBox.
254 wxSize m_colorIconsSize; // Size of swatches in the grid (left column)
255
256 std::vector<wxControl*> m_controlItemsList; // List of ctrls (wxChoice, wxTextCtrl, etc.)
257 // with added event handlers
258};
259
260#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:95
Manage layers needed to make a physical board.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:281
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:574
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...
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