29#include <wx/bmpcbox.h>
32#include <wx/clipbrd.h>
33#include <wx/wupdlock.h>
34#include <wx/richmsgdlg.h>
43#include "magic_enum.hpp"
45#include <wx/textdlg.h>
54#define ID_INCREMENT 256
72static void drawBitmap( wxBitmap& aBitmap, wxColor aColor );
93 == magic_enum::enum_count<DIELECTRIC_MODEL>() );
99 m_panel1->SetBorders(
false,
false,
true,
true );
158 [&]( wxTextCtrl* aTextCtrl )
160 wxString str = aTextCtrl->GetValue();
166 aTextCtrl->ChangeValue( str );
174 convert(
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl ) );
187 int oldBoardWidth =
static_cast<int>(
m_frame->ValueFromString(
m_tcCTValue->GetValue() ) );
200 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
204 int min_thickness = 0;
214 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
216 if( cb_box && !cb_box->GetValue() )
218 items_candidate.push_back( &ui_item );
222 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
224 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
225 min_thickness += item_thickness;
230 if( min_thickness == 0 )
232 title.Printf(
_(
"Enter board thickness in %s:" ),
237 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
238 m_frame->StringFromValue( min_thickness,
true ) );
241 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
243 if( dlg.ShowModal() != wxID_OK )
246 int iu_thickness =
m_frame->ValueFromString( dlg.GetValue() );
248 if( iu_thickness < min_thickness )
250 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
251 m_frame->StringFromValue( min_thickness,
true ) ) );
257 if( items_candidate.size() )
260 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
271 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
275 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
280 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
284 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
289 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
293 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
303 wxArrayString headers;
304 headers.Add(
_(
"Layers" ) );
307 std::vector<wxArrayString> d_list;
308 std::vector<int> rows;
315 if( !item.m_isEnabled )
322 wxArrayString d_item;
326 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
336 d_list.emplace_back( d_item );
337 rows.push_back( row );
342 headers, d_list, wxEmptyString,
365 wxArrayString headers;
366 headers.Add(
_(
"Layers" ) );
371 std::vector<wxArrayString> d_list;
372 std::vector<int> rows;
379 item->GetSublayersCount() <= 1 )
385 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
387 wxArrayString d_item;
389 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
390 item->FormatDielectricLayerName(),
392 item->GetSublayersCount() ) );
394 d_list.emplace_back( d_item );
395 rows.push_back( row++ );
400 headers, d_list, wxEmptyString,
429 if( item->GetSublayersCount() > 1 )
431 event.Enable(
true );
436 event.Enable(
false );
452 if( wxTheClipboard->Open() )
456 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
457 wxTheClipboard->Flush();
458 wxTheClipboard->Close();
467 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
468 int idx = choice ? choice->GetSelection() : 0;
483 const int prePregDefaultThickness =
pcbIUScale.mmToIU( 0.1 );
490 wxASSERT( copperLayerCount % 2 == 0 );
492 int dielectricLayerCount = copperLayerCount - 1;
493 int coreLayerCount = copperLayerCount / 2 - 1;
495 wxASSERT( dielectricLayerCount > 0 );
497 bool currentLayerIsCore =
false;
500 if( copperLayerCount == 2 )
503 currentLayerIsCore =
true;
506 wxASSERT( coreLayerCount > 0 );
508 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
510 int totalWidthOfFixedItems = 0;
519 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
520 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
525 || ( cbLock && cbLock->GetValue() ) )
529 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
530 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
532 totalWidthOfFixedItems += item_thickness;
537 int remainingWidth = targetThickness
538 - totalWidthOfFixedItems
539 - ( prePregDefaultThickness * prePregLayerCount );
541 int prePregThickness = prePregDefaultThickness;
542 int coreThickness = remainingWidth / coreLayerCount;
544 if( coreThickness < prePregThickness )
547 remainingWidth = targetThickness - totalWidthOfFixedItems;
548 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
558 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
566 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
568 if( cbLock && cbLock->GetValue() )
570 currentLayerIsCore = !currentLayerIsCore;
576 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
578 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
579 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
580 textCtrl->SetValue(
m_frame->StringFromValue( layerThickness ) );
582 currentLayerIsCore = !currentLayerIsCore;
598 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
599 int item_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
601 thickness += item_thickness;
604 wxString thicknessStr =
m_frame->StringFromValue( thickness,
true );
624 wxASSERT( copperCount >= 2 );
644 int sub_item = ui_row_item.m_SubItem;
648 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
656 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
661 matName->ChangeValue( item->
GetMaterial( sub_item ) );
669 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
676 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
685 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
688 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
692 ui_row_item.m_UserColor = custom_color;
698 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
701 bm_combo->SetItemBitmap( selected, layerbmp );
722 bm_combo->SetSelection( selected );
728 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
731 textCtrl->ChangeValue( txt );
737 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
740 textCtrl->ChangeValue( txt );
749 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_SpecFreqCtrl );
752 textCtrl->ChangeValue( txt );
754 wxChoice* unitsCtrl =
dynamic_cast<wxChoice*
>( ui_row_item.m_SpecFreqUnitsCtrl );
757 unitsCtrl->SetSelection(
static_cast<int>( units ) );
759 wxChoice* modelCtrl =
dynamic_cast<wxChoice*
>( ui_row_item.m_DielectricModelCtrl );
780 int copperLayersCount = copperMask.count();
796 ui_row_item.m_isEnabled = show_item;
804 if( show_item && !ui_row_item.m_Icon )
807 if( ui_row_item.m_Icon )
810 ui_row_item.m_Icon->Show( show_item );
811 ui_row_item.m_LayerName->Show( show_item );
812 ui_row_item.m_LayerTypeCtrl->Show( show_item );
813 ui_row_item.m_MaterialCtrl->Show( show_item );
815 if( ui_row_item.m_MaterialButt )
816 ui_row_item.m_MaterialButt->Show( show_item );
818 ui_row_item.m_ThicknessCtrl->Show( show_item );
819 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
820 ui_row_item.m_ColorCtrl->Show( show_item );
821 ui_row_item.m_EpsilonCtrl->Show( show_item );
822 ui_row_item.m_LossTgCtrl->Show( show_item );
823 ui_row_item.m_SpecFreqCtrl->Show( show_item );
824 ui_row_item.m_SpecFreqUnitsCtrl->Show( show_item );
825 ui_row_item.m_DielectricModelCtrl->Show( show_item );
833 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
834 m_fgGridSizer->Insert( aPos, emptyText, 0, wxALIGN_CENTER_VERTICAL );
844 int row = ui_row_item.
m_Row;
848 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
849 m_fgGridSizer->Insert( aPos++, bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
850 ui_row_item.
m_Icon = bitmap;
858 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
862 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
863 m_fgGridSizer->Insert( aPos++, st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
868 if( sublayerIdx == 0 )
870 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
873 m_fgGridSizer->Insert( aPos++, choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
886 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
887 st_text->Show(
true );
893 lname =
_(
"Copper" );
897 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
898 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
904 wxString matName = item->
GetMaterial( sublayerIdx );
906 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
907 m_fgGridSizer->Insert( aPos++, bSizerMat, 1, wxRIGHT|wxEXPAND, 4 );
908 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
911 textCtrl->ChangeValue( matName );
916 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
919 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
920 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
922 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
940 textCtrl->ChangeValue(
m_frame->StringFromValue( item->
GetThickness( sublayerIdx ),
true ) );
941 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
943 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
955 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 2 );
972 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
982 m_fgGridSizer->Insert( aPos++, bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
984 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
987 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
1002 bm_combo->SetSelection( selected );
1013 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
1015 textCtrl->ChangeValue( txt );
1016 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1027 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
1029 textCtrl->ChangeValue( txt );
1030 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1040 const double freq = item->
GetSpecFreq( sublayerIdx );
1045 wxTextCtrl* textCtrl =
1047 textCtrl->ChangeValue( txt );
1048 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1051 wxChoice* unitsCtrl =
1053 m_fgGridSizer->Insert( aPos++, unitsCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1055 unitsCtrl->SetSelection(
static_cast<int>( units ) );
1057 wxChoice* modelCtrl =
1059 m_fgGridSizer->Insert( aPos++, modelCtrl, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 2 );
1061 modelCtrl->SetSelection(
static_cast<int>( item->
GetDielectricModel( sublayerIdx ) ) );
1088 if( ui_item.m_MaterialCtrl )
1089 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
1092 delete ui_item.m_Icon;
1093 delete ui_item.m_LayerName;
1094 delete ui_item.m_LayerTypeCtrl;
1095 delete ui_item.m_MaterialCtrl;
1096 delete ui_item.m_MaterialButt;
1097 delete ui_item.m_ThicknessCtrl;
1098 delete ui_item.m_ThicknessLockCtrl;
1099 delete ui_item.m_ColorCtrl;
1100 delete ui_item.m_EpsilonCtrl;
1101 delete ui_item.m_LossTgCtrl;
1102 delete ui_item.m_SpecFreqCtrl;
1103 delete ui_item.m_SpecFreqUnitsCtrl;
1104 delete ui_item.m_DielectricModelCtrl;
1116 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1121 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1150 bool aRelinkStackup )
1154 if( aCreateInitialStackup || aRelinkStackup )
1156 if( aCreateInitialStackup )
1175 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1177 *item = *board_item;
1187 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1189 *item = *board_item;
1201 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1214 bool success =
true;
1220 if( !ui_item.m_isEnabled )
1226 int sub_item = ui_item.m_SubItem;
1237 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1238 wxString txt = textCtrl->GetValue();
1240 if( txt.ToDouble( &value ) && value >= 0.0 )
1242 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1247 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1248 "null if not used)" );
1254 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1255 wxString txt = textCtrl->GetValue();
1257 if( txt.ToDouble( &value ) && value >= 0.0 )
1259 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1265 if( !error_msg.IsEmpty() )
1266 error_msg << wxT(
"\n" );
1268 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1275 wxChoice* modelCtrl =
static_cast<wxChoice*
>( ui_item.m_DielectricModelCtrl );
1276 int modelIdx = modelCtrl->GetCurrentSelection();
1279 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_SpecFreqCtrl );
1280 wxString txt = textCtrl->GetValue();
1282 wxChoice* unitsCtrl =
static_cast<wxChoice*
>( ui_item.m_SpecFreqUnitsCtrl );
1283 int unitsIdx = unitsCtrl->GetCurrentSelection();
1285 auto setFreqValue = [unitsIdx, item, sub_item](
const double freq )
1290 item->SetSpecFreq( freq * 1e9, sub_item );
1294 item->SetSpecFreq( freq * 1e6, sub_item );
1298 item->SetSpecFreq( freq * 1e3, sub_item );
1302 item->SetSpecFreq( freq );
1307 if( txt.ToDouble( &value ) && value >= 0.0 )
1308 setFreqValue( value );
1309 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1310 setFreqValue( value );
1315 if( !error_msg.IsEmpty() )
1316 error_msg << wxT(
"\n" );
1318 error_msg <<
_(
"Incorrect value for specified frequency (must be positive or null "
1325 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1326 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1337 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1341 int idx = choice->GetSelection();
1352 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1353 int new_thickness =
m_frame->ValueFromString( textCtrl->GetValue() );
1357 if( new_thickness < 0 )
1361 if( !error_msg.IsEmpty() )
1362 error_msg << wxT(
"\n" );
1364 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1370 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1377 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1381 int idx = choice->GetSelection();
1384 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1393 wxMessageBox( error_msg,
_(
"Errors" ) );
1425 if( item->IsEnabled() )
1507 int idx =
event.GetSelection();
1508 int item_id =
event.GetId();
1525 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1534 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1536 combo->SetSelection( idx );
1565 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1568 item->GetEpsilonR( ii ),
1569 item->GetLossTangent( ii ) );
1571 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1575 new_mat.
m_Name = item->GetMaterial( ii );
1576 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1593 default: item_mat_list =
nullptr;
break;
1596 wxCHECK( item_mat_list, );
1605 if( substrate.
m_Name.IsEmpty() )
1613 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1614 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1617 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1619 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1620 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1622 item->
SetColor(
"PTFE natural", sub_item );
1624 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1625 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1627 item->
SetColor(
"Polyimide", sub_item );
1629 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1631 item->
SetColor(
"Aluminum", sub_item );
1635 item->
SetColor(
"FR4 natural", sub_item );
1639 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1645 picker->SetSelection( ii );
1653 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1662 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1673 wxString value =
event.GetString();
1700 wxASSERT( st_item );
1716 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1720 wxASSERT_MSG( color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1729 const int bitmap_depth = 24;
1737 st_bitmap->SetBitmap( bmp );
1757 wxEmptyString, wxDefaultPosition,
1758 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1771 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1774 curr_color =
COLOR4D( label );
1785 combo->Append( label, layerbmp );
1793 int sel = combo->GetSelection();
1794 combo->SetSelection( combo->GetCount() - 1 );
1796 combo->SetMinSize( wxSize( -1, -1 ) );
1797 wxSize bestSize = combo->GetBestSize();
1800 combo->SetMinSize( bestSize );
1801 combo->SetSelection( sel );
1807 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1811 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1812 [combo]( wxCommandEvent& aEvent )
1814 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1823 wxNativePixelData data( aBitmap );
1824 wxNativePixelData::Iterator p( data );
1826 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1828 wxNativePixelData::Iterator rowStart = p;
1830 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1832 p.Red() = aColor.Red();
1833 p.Green() = aColor.Green();
1834 p.Blue() = aColor.Blue();
1839 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.