35#include <wx/clipbrd.h>
36#include <wx/wupdlock.h>
37#include <wx/richmsgdlg.h>
45#include <wx/textdlg.h>
53#define ID_INCREMENT 256
71static void drawBitmap( wxBitmap& aBitmap, wxColor aColor );
144 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
148 int min_thickness = 0;
158 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
160 if( cb_box && !cb_box->GetValue() )
162 items_candidate.push_back( &ui_item );
166 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
169 min_thickness += item_thickness;
174 if( min_thickness == 0 )
176 title.Printf(
_(
"Enter board thickness in %s:" ),
181 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
185 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
187 if( dlg.ShowModal() != wxID_OK )
192 if( iu_thickness < min_thickness )
194 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
201 if( items_candidate.size() )
204 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
215 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
219 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
224 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
228 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
233 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
237 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
247 wxArrayString headers;
248 headers.Add(
_(
"Layers" ) );
251 std::vector<wxArrayString> d_list;
252 std::vector<int> rows;
259 if( !item.m_isEnabled )
266 wxArrayString d_item;
270 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
280 d_list.emplace_back( d_item );
281 rows.push_back( row );
286 headers, d_list, wxEmptyString,
291 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
309 wxArrayString headers;
310 headers.Add(
_(
"Layers" ) );
315 std::vector<wxArrayString> d_list;
316 std::vector<int> rows;
323 item->GetSublayersCount() <= 1 )
329 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
331 wxArrayString d_item;
333 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
334 item->FormatDielectricLayerName(),
336 item->GetSublayersCount() ) );
338 d_list.emplace_back( d_item );
339 rows.push_back( row++ );
344 headers, d_list, wxEmptyString,
349 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
373 if( item->GetSublayersCount() > 1 )
375 event.Enable(
true );
380 event.Enable(
false );
394 if( wxTheClipboard->Open() )
398 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
399 wxTheClipboard->Flush();
400 wxTheClipboard->Close();
409 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
410 int idx = choice ? choice->GetSelection() : 0;
432 wxASSERT( copperLayerCount % 2 == 0 );
434 int dielectricLayerCount = copperLayerCount - 1;
435 int coreLayerCount = copperLayerCount / 2 - 1;
437 wxASSERT( dielectricLayerCount > 0 );
439 bool currentLayerIsCore =
false;
442 if( copperLayerCount == 2 )
445 currentLayerIsCore =
true;
448 wxASSERT( coreLayerCount > 0 );
450 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
452 int totalWidthOfFixedItems = 0;
461 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
462 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
467 || ( cbLock && cbLock->GetValue() ) )
471 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
474 totalWidthOfFixedItems += item_thickness;
479 int remainingWidth = targetThickness
480 - totalWidthOfFixedItems
481 - ( prePregDefaultThickness * prePregLayerCount );
483 int prePregThickness = prePregDefaultThickness;
484 int coreThickness = remainingWidth / coreLayerCount;
486 if( coreThickness < prePregThickness )
489 remainingWidth = targetThickness - totalWidthOfFixedItems;
490 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
500 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
508 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
510 if( cbLock && cbLock->GetValue() )
512 currentLayerIsCore = !currentLayerIsCore;
518 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
520 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
521 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
524 currentLayerIsCore = !currentLayerIsCore;
540 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
543 thickness += item_thickness;
566 wxASSERT( copperCount >= 2 );
571 for(
int i = 1; i < copperCount - 1; i++ )
589 int sub_item = ui_row_item.m_SubItem;
593 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
601 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
606 matName->ChangeValue( item->
GetMaterial( sub_item ) );
614 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
621 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
630 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
633 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
637 ui_row_item.m_UserColor = custom_color;
643 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
646 bm_combo->SetItemBitmap( selected, layerbmp );
667 bm_combo->SetSelection( selected );
673 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
676 textCtrl->ChangeValue( txt );
682 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
685 textCtrl->ChangeValue( txt );
703 int copperLayersCount = copperMask.count();
718 ui_row_item.m_isEnabled = show_item;
720 if( show_item && !ui_row_item.m_Icon )
723 if( ui_row_item.m_Icon )
726 ui_row_item.m_Icon->Show( show_item );
727 ui_row_item.m_LayerName->Show( show_item );
728 ui_row_item.m_LayerTypeCtrl->Show( show_item );
729 ui_row_item.m_MaterialCtrl->Show( show_item );
731 if( ui_row_item.m_MaterialButt )
732 ui_row_item.m_MaterialButt->Show( show_item );
734 ui_row_item.m_ThicknessCtrl->Show( show_item );
735 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
736 ui_row_item.m_ColorCtrl->Show( show_item );
737 ui_row_item.m_EpsilonCtrl->Show( show_item );
738 ui_row_item.m_LossTgCtrl->Show( show_item );
747 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
749 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
754 textCtrl->ChangeValue( *aMaterialName );
760 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
762 wxButton* m_buttonMat =
new wxButton(
m_scGridWin, aId,
_(
"..." ), wxDefaultPosition,
763 wxDefaultSize, wxBU_EXACTFIT );
764 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
766 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
778 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
788 int row = ui_row_item.
m_Row;
792 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
793 m_fgGridSizer->Add( bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
794 ui_row_item.
m_Icon = bitmap;
802 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
806 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
807 m_fgGridSizer->Add( st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
812 if( sublayerIdx == 0 )
814 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
817 m_fgGridSizer->Add( choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
830 m_fgGridSizer->Add( st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
831 st_text->Show(
true );
837 lname =
_(
"Copper" );
841 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
842 m_fgGridSizer->Add( st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
848 wxString matName = item->
GetMaterial( sublayerIdx );
861 m_fgGridSizer->Add( textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
863 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
889 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
899 m_fgGridSizer->Add( bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
901 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
904 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
919 bm_combo->SetSelection( selected );
930 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
932 textCtrl->ChangeValue( txt );
933 m_fgGridSizer->Add( textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
944 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
946 textCtrl->ChangeValue( txt );
947 m_fgGridSizer->Add( textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
973 if( ui_item.m_MaterialCtrl )
974 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
977 delete ui_item.m_Icon;
978 delete ui_item.m_LayerName;
979 delete ui_item.m_LayerTypeCtrl;
980 delete ui_item.m_MaterialCtrl;
981 delete ui_item.m_MaterialButt;
982 delete ui_item.m_ThicknessCtrl;
983 delete ui_item.m_ThicknessLockCtrl;
984 delete ui_item.m_ColorCtrl;
985 delete ui_item.m_EpsilonCtrl;
986 delete ui_item.m_LossTgCtrl;
998 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1003 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1029 bool aRelinkStackup )
1033 if( aCreateInitialStackup || aRelinkStackup )
1035 if( aCreateInitialStackup )
1054 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1056 *item = *board_item;
1066 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1068 *item = *board_item;
1080 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1093 bool success =
true;
1100 if( !ui_item.m_isEnabled )
1107 int sub_item = ui_item.m_SubItem;
1118 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1119 wxString txt = textCtrl->GetValue();
1121 if( txt.ToDouble( &value ) && value >= 0.0 )
1123 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1128 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1129 "null if not used)" );
1135 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1136 wxString txt = textCtrl->GetValue();
1138 if( txt.ToDouble( &value ) && value >= 0.0 )
1140 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1146 if( !error_msg.IsEmpty() )
1147 error_msg << wxT(
"\n" );
1149 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1156 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1157 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1168 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1172 int idx = choice->GetSelection();
1183 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1188 if( new_thickness < 0 )
1192 if( !error_msg.IsEmpty() )
1193 error_msg << wxT(
"\n" );
1195 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1201 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1208 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1212 int idx = choice->GetSelection();
1215 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1226 wxMessageBox( error_msg,
_(
"Errors" ) );
1258 if( item->IsEnabled() )
1340 int idx =
event.GetSelection();
1341 int item_id =
event.GetId();
1356 if( dlg.ShowModal() == wxID_OK )
1358 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1363 combo->SetString( idx,
color.ToHexString() );
1367 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1369 combo->SetSelection( idx );
1398 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1401 item->GetEpsilonR( ii ),
1402 item->GetLossTangent( ii ) );
1404 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1408 new_mat.
m_Name = item->GetMaterial( ii );
1409 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1426 default: item_mat_list =
nullptr;
break;
1429 wxCHECK( item_mat_list, );
1433 if( dlg.ShowModal() != wxID_OK )
1438 if( substrate.
m_Name.IsEmpty() )
1446 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1447 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1450 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1452 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1453 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1455 item->
SetColor(
"PTFE natural", sub_item );
1457 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1458 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1460 item->
SetColor(
"Polyimide", sub_item );
1462 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1464 item->
SetColor(
"Aluminum", sub_item );
1468 item->
SetColor(
"FR4 natural", sub_item );
1472 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1478 picker->SetSelection( ii );
1486 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1495 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1506 wxString value =
event.GetString();
1533 wxASSERT( st_item );
1549 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1553 wxASSERT_MSG(
color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1562 const int bitmap_depth = 24;
1570 st_bitmap->SetBitmap( bmp );
1590 wxEmptyString, wxDefaultPosition,
1591 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1604 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1607 curr_color =
COLOR4D( label );
1618 combo->Append( label, layerbmp );
1626 int sel = combo->GetSelection();
1627 combo->SetSelection( combo->GetCount() - 1 );
1629 combo->SetMinSize( wxSize( -1, -1 ) );
1630 wxSize bestSize = combo->GetBestSize();
1633 combo->SetMinSize( bestSize );
1634 combo->SetSelection( sel );
1640 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1644 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1645 [combo]( wxCommandEvent& aEvent )
1647 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1656 wxNativePixelData data( aBitmap );
1657 wxNativePixelData::Iterator p( data );
1659 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1661 wxNativePixelData::Iterator rowStart = p;
1663 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1665 p.Red() = aColor.Red();
1666 p.Green() = aColor.Green();
1667 p.Blue() = aColor.Blue();
1672 p.OffsetY( data, 1 );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
bool IsPrmSpecified(const wxString &aPrmValue)
@ BS_ITEM_TYPE_SILKSCREEN
@ BS_ITEM_TYPE_DIELECTRIC
@ BS_ITEM_TYPE_SOLDERPASTE
@ BS_ITEM_TYPE_SOLDERMASK
wxString BuildStackupReport(BOARD_STACKUP &aStackup, EDA_UNITS aUnits)
Container for design settings for a BOARD object.
int GetBoardThickness() const
The full thickness of the board including copper and masks.
BOARD_STACKUP & GetStackupDescriptor()
int GetCopperLayerCount() const
void SetBoardThickness(int aThickness)
Manage one layer needed to make a physical board.
void AddDielectricPrms(int aDielectricPrmsIdx)
Add (insert) a DIELECTRIC_PRMS item to m_DielectricPrmsList all values are set to default.
wxString GetTypeName() const
int GetSublayersCount() const
double GetEpsilonR(int aDielectricSubLayer=0) const
wxString GetColor(int aDielectricSubLayer=0) const
bool HasEpsilonRValue() const
void SetThickness(int aThickness, int aDielectricSubLayer=0)
bool IsMaterialEditable() const
void SetThicknessLocked(bool aLocked, int aDielectricSubLayer=0)
wxString FormatDielectricLayerName() const
wxString GetLayerName() const
void SetMaterial(const wxString &aName, int aDielectricSubLayer=0)
bool HasLossTangentValue() const
PCB_LAYER_ID GetBrdLayerId() const
bool IsThicknessEditable() const
void SetLossTangent(double aTg, int aDielectricSubLayer=0)
int GetThickness(int aDielectricSubLayer=0) const
void SetEnabled(bool aEnable)
BOARD_STACKUP_ITEM_TYPE GetType() const
wxString GetMaterial(int aDielectricSubLayer=0) const
void SetTypeName(const wxString &aName)
bool IsThicknessLocked(int aDielectricSubLayer=0) const
wxString FormatEpsilonR(int aDielectricSubLayer=0) const
void SetColor(const wxString &aColorName, int aDielectricSubLayer=0)
void SetEpsilonR(double aEpsilon, int aDielectricSubLayer=0)
void SetLayerName(const wxString &aName)
void RemoveDielectricPrms(int aDielectricPrmsIdx)
Remove a DIELECTRIC_PRMS item from m_DielectricPrmsList.
int GetDielectricLayerId() const
bool IsColorEditable() const
wxString FormatLossTangent(int aDielectricSubLayer=0) const
double GetLossTangent(int aDielectricSubLayer=0) const
Manage layers needed to make a physical board.
void RemoveAll()
Delete all items in list and clear the list.
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard, int aNestLevel) const
Write the stackup info on board file.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
static LSET StackupAllowedBrdLayers()
int BuildBoardThicknessFromStackup() const
bool m_HasDielectricConstrains
True if some layers have impedance controlled tracks or have specific constrains for micro-wave appli...
void Add(BOARD_STACKUP_ITEM *aItem)
Add a new item in stackup layer.
void BuildDefaultStackupList(const BOARD_DESIGN_SETTINGS *aSettings, int aActiveCopperLayersCount=0)
Create a default stackup, according to the current BOARD_DESIGN_SETTINGS settings.
Information pertinent to a Pcbnew printed circuit board.
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
int GetCopperLayerCount() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
KIGFX::COLOR4D GetColor()
a Dialog to select/change/add a dielectric material from a material list
DIELECTRIC_SUBSTRATE GetSelectedSubstrate()
int AppendSubstrate(DIELECTRIC_SUBSTRATE &aItem)
Append a item in list similar to aItem.
int FindSubstrate(DIELECTRIC_SUBSTRATE *aItem)
Find a item in list similar to aItem.
void SetListLabel(const wxString &aLabel)
A color representation with 4 components: red, green, blue, alpha.
wxColour ToColour() const
static void DrawColorSwatch(wxBitmap &aLayerbmp, const COLOR4D &aBackground, const COLOR4D &aColor)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
LSET is a set of PCB_LAYER_IDs.
static LSET ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static LSET InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
static PAGED_DIALOG * GetDialog(wxWindow *aWindow)
Class PANEL_SETUP_BOARD_STACKUP_BASE.
wxScrolledWindow * m_scGridWin
wxStaticText * m_staticTextLayer
wxStaticText * m_staticTextMaterial
wxStaticText * m_staticTextLayerId
wxStaticBitmap * m_bitmapLockThickness
wxStaticText * m_staticTextColor
wxCheckBox * m_impedanceControlled
wxStaticText * m_staticTextType
wxStaticText * m_staticTextThickness
wxFlexGridSizer * m_fgGridSizer
wxStaticText * m_staticTextLossTg
wxStaticText * m_staticTextEpsilonR
wxChoice * m_choiceCopperLayers
int GetSublayerId(int aRow)
void onAddDielectricLayer(wxCommandEvent &event) override
void lazyBuildRowUI(BOARD_STACKUP_ROW_UI_ITEM &ui_row_item)
Creates the controls in a BOARD_STACKUP_ROW_UI_ITEM relative to the aStackupItem.
DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList
wxArrayString m_core_prepreg_choice
void onExportToClipboard(wxCommandEvent &event) override
bool transferDataFromUIToStackup()
Transfer current UI settings to m_stackup but not to the board.
wxControl * addSpacer()
add a Spacer in m_fgGridSizer when a empty cell is needed
wxSize m_numericTextCtrlSize
std::vector< wxControl * > m_controlItemsList
void onColorSelected(wxCommandEvent &event)
bool TransferDataFromWindow() override
void onCopperLayersSelCount(wxCommandEvent &event) override
void ImportSettingsFrom(BOARD *aBoard)
wxColor getColorIconItem(int aRow)
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
int computeBoardThickness()
Recompute the board thickness and update the textbox.
void setDefaultLayerWidths(int targetThickness)
Set the widths of dielectric layers to sensible defaults.
PANEL_SETUP_BOARD_STACKUP(wxWindow *aParentWindow, PCB_EDIT_FRAME *aFrame, PANEL_SETUP_LAYERS *aPanelLayers)
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
int GetCopperLayerCount() const
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
DIELECTRIC_SUBSTRATE_LIST m_delectricMatList
wxBitmapComboBox * createColorBox(BOARD_STACKUP_ITEM *aStackupItem, int aRow)
creates a bitmap combobox to select a layer color
wxSize m_numericFieldsSize
void disconnectEvents()
disconnect event handlers connected to wxControl items found in list m_controlItemsList
void onAdjustDielectricThickness(wxCommandEvent &event) override
void addMaterialChooser(wxWindowID aId, const wxString *aMaterialName, BOARD_STACKUP_ROW_UI_ITEM &aUiRowItem)
add a control (a wxTextCtrl + a button) in m_fgGridSizer to select a material
~PANEL_SETUP_BOARD_STACKUP()
void onMaterialChange(wxCommandEvent &event)
wxSize m_colorSwatchesSize
void rebuildLayerStackPanel(bool aRelinkItems=false)
Populate m_fgGridSizer with items to handle stackup parameters If previous items are in list,...
bool IsInitialized() const
void SetPhysicalStackupPanel(PANEL_SETUP_BOARD_STACKUP *aPanel)
The main frame for Pcbnew.
void OnModify() override
Must be called after a board change to set the modified flag.
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Converts aValue in internal units into a united string.
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Converts aTextValue in aUnits to internal units used by the frame.
EDA_UNITS GetUserUnits() const
void SetBorders(bool aLeft, bool aRight, bool aTop, bool aBottom)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString GetText(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
static wxColor pasteColor(200, 200, 200)
static wxColor copperColor(220, 180, 30)
static wxColor dielectricColor(75, 120, 75)
static void drawBitmap(wxBitmap &aBitmap, wxColor aColor)
@ ID_ITEM_THICKNESS_LOCKED
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
std::vector< FAB_LAYER_COLOR > dummy
const std::vector< FAB_LAYER_COLOR > & GetStandardColors(BOARD_STACKUP_ITEM_TYPE aType)
int GetColorUserDefinedListIdx(BOARD_STACKUP_ITEM_TYPE aType)
bool IsCustomColorIdx(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
KIGFX::COLOR4D GetStandardColor(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
wxString NotSpecifiedPrm()
const wxString & GetStandardColorName(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
KIGFX::COLOR4D GetDefaultUserColor(BOARD_STACKUP_ITEM_TYPE aType)
std::string UIDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 We want to avoid scientific ...
wxControl * m_ThicknessCtrl
wxStaticText * m_LayerName
wxControl * m_ThicknessLockCtrl
wxControl * m_EpsilonCtrl
wxButton * m_MaterialButt
wxControl * m_MaterialCtrl
wxControl * m_LayerTypeCtrl
BOARD_STACKUP_ITEM * m_Item
constexpr int mmToIU(double mm) const