33#include <wx/bmpcbox.h>
36#include <wx/clipbrd.h>
37#include <wx/wupdlock.h>
38#include <wx/richmsgdlg.h>
47#include "magic_enum.hpp"
49#include <wx/textdlg.h>
58#define ID_INCREMENT 256
76static void drawBitmap( wxBitmap& aBitmap, wxColor aColor );
97 == magic_enum::enum_count<DIELECTRIC_MODEL>() );
103 m_panel1->SetBorders(
false,
false,
true,
true );
162 [&]( wxTextCtrl* aTextCtrl )
164 wxString str = aTextCtrl->GetValue();
170 aTextCtrl->ChangeValue( str );
178 convert(
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl ) );
191 int oldBoardWidth =
static_cast<int>(
m_frame->ValueFromString(
m_tcCTValue->GetValue() ) );
204 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
208 int min_thickness = 0;
218 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
220 if( cb_box && !cb_box->GetValue() )
222 items_candidate.push_back( &ui_item );
226 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
228 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
229 min_thickness += item_thickness;
234 if( min_thickness == 0 )
236 title.Printf(
_(
"Enter board thickness in %s:" ),
241 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
242 m_frame->StringFromValue( min_thickness,
true ) );
245 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
247 if( dlg.ShowModal() != wxID_OK )
250 int iu_thickness =
m_frame->ValueFromString( dlg.GetValue() );
252 if( iu_thickness < min_thickness )
254 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
255 m_frame->StringFromValue( min_thickness,
true ) ) );
261 if( items_candidate.size() )
264 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
275 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
279 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
284 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
288 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
293 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
297 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
307 wxArrayString headers;
308 headers.Add(
_(
"Layers" ) );
311 std::vector<wxArrayString> d_list;
312 std::vector<int> rows;
319 if( !item.m_isEnabled )
326 wxArrayString d_item;
330 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
340 d_list.emplace_back( d_item );
341 rows.push_back( row );
346 headers, d_list, wxEmptyString,
369 wxArrayString headers;
370 headers.Add(
_(
"Layers" ) );
375 std::vector<wxArrayString> d_list;
376 std::vector<int> rows;
383 item->GetSublayersCount() <= 1 )
389 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
391 wxArrayString d_item;
393 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
394 item->FormatDielectricLayerName(),
396 item->GetSublayersCount() ) );
398 d_list.emplace_back( d_item );
399 rows.push_back( row++ );
404 headers, d_list, wxEmptyString,
433 if( item->GetSublayersCount() > 1 )
435 event.Enable(
true );
440 event.Enable(
false );
456 if( wxTheClipboard->Open() )
460 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
461 wxTheClipboard->Flush();
462 wxTheClipboard->Close();
471 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
472 int idx = choice ? choice->GetSelection() : 0;
487 const int prePregDefaultThickness =
pcbIUScale.mmToIU( 0.1 );
494 wxASSERT( copperLayerCount % 2 == 0 );
496 int dielectricLayerCount = copperLayerCount - 1;
497 int coreLayerCount = copperLayerCount / 2 - 1;
499 wxASSERT( dielectricLayerCount > 0 );
501 bool currentLayerIsCore =
false;
504 if( copperLayerCount == 2 )
507 currentLayerIsCore =
true;
510 wxASSERT( coreLayerCount > 0 );
512 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
514 int totalWidthOfFixedItems = 0;
523 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
524 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
529 || ( cbLock && cbLock->GetValue() ) )
533 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
534 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
536 totalWidthOfFixedItems += item_thickness;
541 int remainingWidth = targetThickness
542 - totalWidthOfFixedItems
543 - ( prePregDefaultThickness * prePregLayerCount );
545 int prePregThickness = prePregDefaultThickness;
546 int coreThickness = remainingWidth / coreLayerCount;
548 if( coreThickness < prePregThickness )
551 remainingWidth = targetThickness - totalWidthOfFixedItems;
552 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
562 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
570 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
572 if( cbLock && cbLock->GetValue() )
574 currentLayerIsCore = !currentLayerIsCore;
580 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
582 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
583 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
584 textCtrl->SetValue(
m_frame->StringFromValue( layerThickness ) );
586 currentLayerIsCore = !currentLayerIsCore;
602 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
603 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
605 thickness += item_thickness;
608 wxString thicknessStr =
m_frame->StringFromValue( thickness,
true );
628 wxASSERT( copperCount >= 2 );
648 int sub_item = ui_row_item.m_SubItem;
652 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
660 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
665 matName->ChangeValue( item->
GetMaterial( sub_item ) );
673 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
680 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
689 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
692 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
696 ui_row_item.m_UserColor = custom_color;
702 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
705 bm_combo->SetItemBitmap( selected, layerbmp );
726 bm_combo->SetSelection( selected );
732 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
735 textCtrl->ChangeValue( txt );
741 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
744 textCtrl->ChangeValue( txt );
753 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_SpecFreqCtrl );
756 textCtrl->ChangeValue( txt );
758 wxChoice* unitsCtrl =
dynamic_cast<wxChoice*
>( ui_row_item.m_SpecFreqUnitsCtrl );
761 unitsCtrl->SetSelection(
static_cast<int>( units ) );
763 wxChoice* modelCtrl =
dynamic_cast<wxChoice*
>( ui_row_item.m_DielectricModelCtrl );
784 int copperLayersCount = copperMask.count();
800 ui_row_item.m_isEnabled = show_item;
808 if( show_item && !ui_row_item.m_Icon )
811 if( ui_row_item.m_Icon )
814 ui_row_item.m_Icon->Show( show_item );
815 ui_row_item.m_LayerName->Show( show_item );
816 ui_row_item.m_LayerTypeCtrl->Show( show_item );
817 ui_row_item.m_MaterialCtrl->Show( show_item );
819 if( ui_row_item.m_MaterialButt )
820 ui_row_item.m_MaterialButt->Show( show_item );
822 ui_row_item.m_ThicknessCtrl->Show( show_item );
823 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
824 ui_row_item.m_ColorCtrl->Show( show_item );
825 ui_row_item.m_EpsilonCtrl->Show( show_item );
826 ui_row_item.m_LossTgCtrl->Show( show_item );
827 ui_row_item.m_SpecFreqCtrl->Show( show_item );
828 ui_row_item.m_SpecFreqUnitsCtrl->Show( show_item );
829 ui_row_item.m_DielectricModelCtrl->Show( show_item );
837 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
838 m_fgGridSizer->Insert( aPos, emptyText, 0, wxALIGN_CENTER_VERTICAL );
848 int row = ui_row_item.
m_Row;
852 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
853 m_fgGridSizer->Insert( aPos++, bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
854 ui_row_item.
m_Icon = bitmap;
862 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
866 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
867 m_fgGridSizer->Insert( aPos++, st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
872 if( sublayerIdx == 0 )
874 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
877 m_fgGridSizer->Insert( aPos++, choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
890 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
891 st_text->Show(
true );
897 lname =
_(
"Copper" );
901 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
902 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
908 wxString matName = item->
GetMaterial( sublayerIdx );
910 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
911 m_fgGridSizer->Insert( aPos++, bSizerMat, 1, wxRIGHT|wxEXPAND, 4 );
912 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
915 textCtrl->ChangeValue( matName );
920 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
923 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
924 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
926 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
944 textCtrl->ChangeValue(
m_frame->StringFromValue( item->
GetThickness( sublayerIdx ),
true ) );
945 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
947 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
959 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 2 );
976 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
986 m_fgGridSizer->Insert( aPos++, bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
988 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
991 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
1006 bm_combo->SetSelection( selected );
1017 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
1019 textCtrl->ChangeValue( txt );
1020 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1031 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
1033 textCtrl->ChangeValue( txt );
1034 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1044 const double freq = item->
GetSpecFreq( sublayerIdx );
1049 wxTextCtrl* textCtrl =
1051 textCtrl->ChangeValue( txt );
1052 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1055 wxChoice* unitsCtrl =
1057 m_fgGridSizer->Insert( aPos++, unitsCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1059 unitsCtrl->SetSelection(
static_cast<int>( units ) );
1061 wxChoice* modelCtrl =
1063 m_fgGridSizer->Insert( aPos++, modelCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1065 modelCtrl->SetSelection(
static_cast<int>( item->
GetDielectricModel( sublayerIdx ) ) );
1092 if( ui_item.m_MaterialCtrl )
1093 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
1096 delete ui_item.m_Icon;
1097 delete ui_item.m_LayerName;
1098 delete ui_item.m_LayerTypeCtrl;
1099 delete ui_item.m_MaterialCtrl;
1100 delete ui_item.m_MaterialButt;
1101 delete ui_item.m_ThicknessCtrl;
1102 delete ui_item.m_ThicknessLockCtrl;
1103 delete ui_item.m_ColorCtrl;
1104 delete ui_item.m_EpsilonCtrl;
1105 delete ui_item.m_LossTgCtrl;
1106 delete ui_item.m_SpecFreqCtrl;
1107 delete ui_item.m_SpecFreqUnitsCtrl;
1108 delete ui_item.m_DielectricModelCtrl;
1120 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1125 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1154 bool aRelinkStackup )
1158 if( aCreateInitialStackup || aRelinkStackup )
1160 if( aCreateInitialStackup )
1179 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1181 *item = *board_item;
1191 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1193 *item = *board_item;
1205 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1218 bool success =
true;
1224 if( !ui_item.m_isEnabled )
1230 int sub_item = ui_item.m_SubItem;
1241 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1242 wxString txt = textCtrl->GetValue();
1244 if( txt.ToDouble( &value ) && value >= 0.0 )
1246 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1251 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1252 "null if not used)" );
1258 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1259 wxString txt = textCtrl->GetValue();
1261 if( txt.ToDouble( &value ) && value >= 0.0 )
1263 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1269 if( !error_msg.IsEmpty() )
1270 error_msg << wxT(
"\n" );
1272 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1279 wxChoice* modelCtrl =
static_cast<wxChoice*
>( ui_item.m_DielectricModelCtrl );
1280 int modelIdx = modelCtrl->GetCurrentSelection();
1283 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_SpecFreqCtrl );
1284 wxString txt = textCtrl->GetValue();
1286 wxChoice* unitsCtrl =
static_cast<wxChoice*
>( ui_item.m_SpecFreqUnitsCtrl );
1287 int unitsIdx = unitsCtrl->GetCurrentSelection();
1289 auto setFreqValue = [unitsIdx, item, sub_item](
const double freq )
1294 item->SetSpecFreq( freq * 1e9, sub_item );
1298 item->SetSpecFreq( freq * 1e6, sub_item );
1302 item->SetSpecFreq( freq * 1e3, sub_item );
1306 item->SetSpecFreq( freq );
1311 if( txt.ToDouble( &value ) && value >= 0.0 )
1312 setFreqValue( value );
1313 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1314 setFreqValue( value );
1319 if( !error_msg.IsEmpty() )
1320 error_msg << wxT(
"\n" );
1322 error_msg <<
_(
"Incorrect value for specified frequency (must be positive or null "
1329 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1330 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1341 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1345 int idx = choice->GetSelection();
1356 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1357 int new_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
1361 if( new_thickness < 0 )
1365 if( !error_msg.IsEmpty() )
1366 error_msg << wxT(
"\n" );
1368 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1374 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1381 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1385 int idx = choice->GetSelection();
1388 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1397 wxMessageBox( error_msg,
_(
"Errors" ) );
1429 if( item->IsEnabled() )
1511 int idx =
event.GetSelection();
1512 int item_id =
event.GetId();
1529 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1538 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1540 combo->SetSelection( idx );
1569 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1572 item->GetEpsilonR( ii ),
1573 item->GetLossTangent( ii ) );
1575 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1579 new_mat.
m_Name = item->GetMaterial( ii );
1580 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1597 default: item_mat_list =
nullptr;
break;
1600 wxCHECK( item_mat_list, );
1609 if( substrate.
m_Name.IsEmpty() )
1617 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1618 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1621 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1623 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1624 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1626 item->
SetColor(
"PTFE natural", sub_item );
1628 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1629 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1631 item->
SetColor(
"Polyimide", sub_item );
1633 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1635 item->
SetColor(
"Aluminum", sub_item );
1639 item->
SetColor(
"FR4 natural", sub_item );
1643 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1649 picker->SetSelection( ii );
1657 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1666 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1677 wxString value =
event.GetString();
1704 wxASSERT( st_item );
1720 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1724 wxASSERT_MSG( color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1733 const int bitmap_depth = 24;
1741 st_bitmap->SetBitmap( bmp );
1761 wxEmptyString, wxDefaultPosition,
1762 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1775 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1778 curr_color =
COLOR4D( label );
1789 combo->Append( label, layerbmp );
1797 int sel = combo->GetSelection();
1798 combo->SetSelection( combo->GetCount() - 1 );
1800 combo->SetMinSize( wxSize( -1, -1 ) );
1801 wxSize bestSize = combo->GetBestSize();
1804 combo->SetMinSize( bestSize );
1805 combo->SetSelection( sel );
1811 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1815 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1816 [combo]( wxCommandEvent& aEvent )
1818 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1827 wxNativePixelData data( aBitmap );
1828 wxNativePixelData::Iterator p( data );
1830 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1832 wxNativePixelData::Iterator rowStart = p;
1834 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1836 p.Red() = aColor.Red();
1837 p.Green() = aColor.Green();
1838 p.Blue() = aColor.Blue();
1843 p.OffsetY( data, 1 );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
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.
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
DIELECTRIC_MODEL GetDielectricModel(int aDielectricSubLayer=0) const
int GetSublayersCount() const
bool HasSpecFreqValue() 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 SetDielectricModel(DIELECTRIC_MODEL aModel, int aDielectricSubLayer=0)
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)
double GetSpecFreq(int aDielectricSubLayer=0) const
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.
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 FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard) const
Write the stackup info on board file.
Information pertinent to a Pcbnew printed circuit board.
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.
wxString ToHexString() const
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 const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static const LSET & ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static const 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)
wxScrolledWindow * m_scGridWin
wxStaticText * m_staticTextLayer
wxStaticText * m_staticTextMaterial
wxStaticText * m_staticTextLayerId
wxStaticText * m_staticTextSpecFreq
wxStaticBitmap * m_bitmapLockThickness
wxStaticText * m_staticTextColor
wxCheckBox * m_impedanceControlled
wxStaticText * m_staticTextType
wxStaticText * m_staticTextThickness
wxFlexGridSizer * m_fgGridSizer
wxStaticText * m_staticTextDielectricModel
wxStaticText * m_staticTextLossTg
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)
wxStaticText * m_staticTextSpecFreqUnits
wxStaticText * m_staticTextEpsilonR
wxChoice * m_choiceCopperLayers
int GetSublayerId(int aRow)
static wxString m_dielecticModelChoices[2]
The choices available for dielectric frequency-dependency model.
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.
PANEL_SETUP_BOARD_STACKUP(wxWindow *aParentWindow, PCB_EDIT_FRAME *aFrame, PANEL_SETUP_LAYERS *aPanelLayers, PANEL_SETUP_BOARD_FINISH *aPanelFinish)
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)
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
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
void OnLayersOptionsChanged(const LSET &aNewLayerSet)
Must be called if the copper layers count has changed or solder mask, solder paste or silkscreen laye...
~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,...
The main frame for Pcbnew.
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)
Convert 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)
Return 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
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
wxControl * m_SpecFreqUnitsCtrl
wxStaticText * m_LayerName
wxControl * m_ThicknessLockCtrl
wxControl * m_EpsilonCtrl
wxButton * m_MaterialButt
wxControl * m_SpecFreqCtrl
wxControl * m_MaterialCtrl
wxControl * m_DielectricModelCtrl
wxControl * m_LayerTypeCtrl
BOARD_STACKUP_ITEM * m_Item
DIELECTRIC_MODEL
Frequency-domain model used for the substrate dielectric properties.