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 );
139 [&]( wxTextCtrl* aTextCtrl )
141 wxString str = aTextCtrl->GetValue();
147 aTextCtrl->ChangeValue( str );
155 convert(
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl ) );
181 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
185 int min_thickness = 0;
195 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
197 if( cb_box && !cb_box->GetValue() )
199 items_candidate.push_back( &ui_item );
203 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
206 min_thickness += item_thickness;
211 if( min_thickness == 0 )
213 title.Printf(
_(
"Enter board thickness in %s:" ),
218 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
222 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
224 if( dlg.ShowModal() != wxID_OK )
229 if( iu_thickness < min_thickness )
231 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
238 if( items_candidate.size() )
241 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
252 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
256 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
261 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
265 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
270 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
274 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
284 wxArrayString headers;
285 headers.Add(
_(
"Layers" ) );
288 std::vector<wxArrayString> d_list;
289 std::vector<int> rows;
296 if( !item.m_isEnabled )
303 wxArrayString d_item;
307 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
317 d_list.emplace_back( d_item );
318 rows.push_back( row );
323 headers, d_list, wxEmptyString,
328 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
346 wxArrayString headers;
347 headers.Add(
_(
"Layers" ) );
352 std::vector<wxArrayString> d_list;
353 std::vector<int> rows;
360 item->GetSublayersCount() <= 1 )
366 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
368 wxArrayString d_item;
370 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
371 item->FormatDielectricLayerName(),
373 item->GetSublayersCount() ) );
375 d_list.emplace_back( d_item );
376 rows.push_back( row++ );
381 headers, d_list, wxEmptyString,
386 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
410 if( item->GetSublayersCount() > 1 )
412 event.Enable(
true );
417 event.Enable(
false );
431 if( wxTheClipboard->Open() )
435 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
436 wxTheClipboard->Flush();
437 wxTheClipboard->Close();
446 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
447 int idx = choice ? choice->GetSelection() : 0;
469 wxASSERT( copperLayerCount % 2 == 0 );
471 int dielectricLayerCount = copperLayerCount - 1;
472 int coreLayerCount = copperLayerCount / 2 - 1;
474 wxASSERT( dielectricLayerCount > 0 );
476 bool currentLayerIsCore =
false;
479 if( copperLayerCount == 2 )
482 currentLayerIsCore =
true;
485 wxASSERT( coreLayerCount > 0 );
487 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
489 int totalWidthOfFixedItems = 0;
498 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
499 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
504 || ( cbLock && cbLock->GetValue() ) )
508 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
511 totalWidthOfFixedItems += item_thickness;
516 int remainingWidth = targetThickness
517 - totalWidthOfFixedItems
518 - ( prePregDefaultThickness * prePregLayerCount );
520 int prePregThickness = prePregDefaultThickness;
521 int coreThickness = remainingWidth / coreLayerCount;
523 if( coreThickness < prePregThickness )
526 remainingWidth = targetThickness - totalWidthOfFixedItems;
527 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
537 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
545 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
547 if( cbLock && cbLock->GetValue() )
549 currentLayerIsCore = !currentLayerIsCore;
555 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
557 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
558 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
561 currentLayerIsCore = !currentLayerIsCore;
577 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
580 thickness += item_thickness;
603 wxASSERT( copperCount >= 2 );
608 for(
int i = 1; i < copperCount - 1; i++ )
626 int sub_item = ui_row_item.m_SubItem;
630 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
638 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
643 matName->ChangeValue( item->
GetMaterial( sub_item ) );
651 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
658 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
667 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
670 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
674 ui_row_item.m_UserColor = custom_color;
680 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
683 bm_combo->SetItemBitmap( selected, layerbmp );
704 bm_combo->SetSelection( selected );
710 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
713 textCtrl->ChangeValue( txt );
719 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
722 textCtrl->ChangeValue( txt );
740 int copperLayersCount = copperMask.count();
756 ui_row_item.m_isEnabled = show_item;
764 if( show_item && !ui_row_item.m_Icon )
767 if( ui_row_item.m_Icon )
770 ui_row_item.m_Icon->Show( show_item );
771 ui_row_item.m_LayerName->Show( show_item );
772 ui_row_item.m_LayerTypeCtrl->Show( show_item );
773 ui_row_item.m_MaterialCtrl->Show( show_item );
775 if( ui_row_item.m_MaterialButt )
776 ui_row_item.m_MaterialButt->Show( show_item );
778 ui_row_item.m_ThicknessCtrl->Show( show_item );
779 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
780 ui_row_item.m_ColorCtrl->Show( show_item );
781 ui_row_item.m_EpsilonCtrl->Show( show_item );
782 ui_row_item.m_LossTgCtrl->Show( show_item );
790 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
791 m_fgGridSizer->Insert( aPos, emptyText, 0, wxALIGN_CENTER_VERTICAL );
801 int row = ui_row_item.
m_Row;
805 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
806 m_fgGridSizer->Insert( aPos++, bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
807 ui_row_item.
m_Icon = bitmap;
815 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
819 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
820 m_fgGridSizer->Insert( aPos++, st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
825 if( sublayerIdx == 0 )
827 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
830 m_fgGridSizer->Insert( aPos++, choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
843 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
844 st_text->Show(
true );
850 lname =
_(
"Copper" );
854 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
855 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
861 wxString matName = item->
GetMaterial( sublayerIdx );
863 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
864 m_fgGridSizer->Insert( aPos++, bSizerMat, 1, wxRIGHT|wxEXPAND, 4 );
865 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
868 textCtrl->ChangeValue( matName );
873 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
876 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
877 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
879 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
898 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
900 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
910 m_fgGridSizer->Insert( aPos++, cb_box, 0, wxALIGN_CENTER_VERTICAL, 2 );
926 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
936 m_fgGridSizer->Insert( aPos++, bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
938 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
941 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
956 bm_combo->SetSelection( selected );
967 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
969 textCtrl->ChangeValue( txt );
970 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
981 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
983 textCtrl->ChangeValue( txt );
984 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1010 if( ui_item.m_MaterialCtrl )
1011 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
1014 delete ui_item.m_Icon;
1015 delete ui_item.m_LayerName;
1016 delete ui_item.m_LayerTypeCtrl;
1017 delete ui_item.m_MaterialCtrl;
1018 delete ui_item.m_MaterialButt;
1019 delete ui_item.m_ThicknessCtrl;
1020 delete ui_item.m_ThicknessLockCtrl;
1021 delete ui_item.m_ColorCtrl;
1022 delete ui_item.m_EpsilonCtrl;
1023 delete ui_item.m_LossTgCtrl;
1035 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1040 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1066 bool aRelinkStackup )
1070 if( aCreateInitialStackup || aRelinkStackup )
1072 if( aCreateInitialStackup )
1091 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1093 *item = *board_item;
1103 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1105 *item = *board_item;
1117 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1130 bool success =
true;
1137 if( !ui_item.m_isEnabled )
1144 int sub_item = ui_item.m_SubItem;
1155 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1156 wxString txt = textCtrl->GetValue();
1158 if( txt.ToDouble( &value ) && value >= 0.0 )
1160 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1165 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1166 "null if not used)" );
1172 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1173 wxString txt = textCtrl->GetValue();
1175 if( txt.ToDouble( &value ) && value >= 0.0 )
1177 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1183 if( !error_msg.IsEmpty() )
1184 error_msg << wxT(
"\n" );
1186 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1193 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1194 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1205 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1209 int idx = choice->GetSelection();
1220 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1225 if( new_thickness < 0 )
1229 if( !error_msg.IsEmpty() )
1230 error_msg << wxT(
"\n" );
1232 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1238 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1245 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1249 int idx = choice->GetSelection();
1252 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1263 wxMessageBox( error_msg,
_(
"Errors" ) );
1295 if( item->IsEnabled() )
1377 int idx =
event.GetSelection();
1378 int item_id =
event.GetId();
1393 if( dlg.ShowModal() == wxID_OK )
1395 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1400 combo->SetString( idx,
color.ToHexString() );
1404 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1406 combo->SetSelection( idx );
1435 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1438 item->GetEpsilonR( ii ),
1439 item->GetLossTangent( ii ) );
1441 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1445 new_mat.
m_Name = item->GetMaterial( ii );
1446 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1463 default: item_mat_list =
nullptr;
break;
1466 wxCHECK( item_mat_list, );
1470 if( dlg.ShowModal() != wxID_OK )
1475 if( substrate.
m_Name.IsEmpty() )
1483 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1484 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1487 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1489 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1490 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1492 item->
SetColor(
"PTFE natural", sub_item );
1494 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1495 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1497 item->
SetColor(
"Polyimide", sub_item );
1499 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1501 item->
SetColor(
"Aluminum", sub_item );
1505 item->
SetColor(
"FR4 natural", sub_item );
1509 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1515 picker->SetSelection( ii );
1523 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1532 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1543 wxString value =
event.GetString();
1570 wxASSERT( st_item );
1586 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1590 wxASSERT_MSG(
color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1599 const int bitmap_depth = 24;
1607 st_bitmap->SetBitmap( bmp );
1627 wxEmptyString, wxDefaultPosition,
1628 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1641 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1644 curr_color =
COLOR4D( label );
1655 combo->Append( label, layerbmp );
1663 int sel = combo->GetSelection();
1664 combo->SetSelection( combo->GetCount() - 1 );
1666 combo->SetMinSize( wxSize( -1, -1 ) );
1667 wxSize bestSize = combo->GetBestSize();
1670 combo->SetMinSize( bestSize );
1671 combo->SetSelection( sel );
1677 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1681 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1682 [combo]( wxCommandEvent& aEvent )
1684 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1693 wxNativePixelData data( aBitmap );
1694 wxNativePixelData::Iterator p( data );
1696 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1698 wxNativePixelData::Iterator rowStart = p;
1700 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1702 p.Red() = aColor.Red();
1703 p.Green() = aColor.Green();
1704 p.Blue() = aColor.Blue();
1709 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
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.
wxSize m_numericTextCtrlSize
std::vector< wxControl * > m_controlItemsList
void onColorSelected(wxCommandEvent &event)
bool TransferDataFromWindow() override
void onCopperLayersSelCount(wxCommandEvent &event) override
void onUnitsChanged(wxCommandEvent &event)
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
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.
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
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
wxSize m_numericFieldsSize
void disconnectEvents()
disconnect event handlers connected to wxControl items found in list m_controlItemsList
void onAdjustDielectricThickness(wxCommandEvent &event) override
~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.
const EDA_IU_SCALE & GetIuScale() const
EDA_UNITS GetUserUnits() const
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
void SetBorders(bool aLeft, bool aRight, bool aTop, bool aBottom)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API long long int ValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application.
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
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
int GetUserUnits()
Return the currently selected user unit value for the interface.
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