7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-11 14:50:11 +00:00

Expose padstack settings in via properties dialog

Behind a flag because this feature may not
stabilize before V9
This commit is contained in:
Jon Evans 2024-11-02 10:02:17 -04:00
parent 88e028bc24
commit 59f7615fbd
9 changed files with 518 additions and 26 deletions

View File

@ -125,6 +125,8 @@ static const wxChar EnableSnapAnchorsDebug[] = wxT( "EnableSnapAnchorsDebug" );
static const wxChar EnableODB[] = wxT( "EnableODB" );
static const wxChar EnableJobset[] = wxT( "EnableJobset" );
static const wxChar MinParallelAngle[] = wxT( "MinParallelAngle" );
static const wxChar EnableViaStacks[] = wxT( "EnableViaStacks" );
} // namespace KEYS
@ -296,6 +298,7 @@ ADVANCED_CFG::ADVANCED_CFG()
m_EnableSnapAnchorsDebug = false;
m_MinParallelAngle = 0.001;
m_EnableViaStacks = false;
loadFromConfigFile();
}
@ -570,6 +573,10 @@ void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
&m_MinParallelAngle, m_MinParallelAngle,
0.0, 45.0 ) );
configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::EnableViaStacks,
&m_EnableViaStacks,
m_EnableViaStacks ) );
// Special case for trace mask setting...we just grab them and set them immediately
// Because we even use wxLogTrace inside of advanced config
wxString traceMasks;

View File

@ -714,6 +714,11 @@ public:
*/
double m_MinParallelAngle;
/**
* Enables the user-visible editing features for via stacks
*/
bool m_EnableViaStacks;
///@}
private:

View File

@ -855,6 +855,8 @@ void DIALOG_PAD_PROPERTIES::initPadstackLayerValues()
void DIALOG_PAD_PROPERTIES::afterPadstackModeChanged()
{
// NOTE: synchronize changes here with DIALOG_TRACK_VIA_PROPERTIES::afterPadstackModeChanged
wxCHECK_MSG( m_board, /* void */, "Expected valid board in afterPadstackModeChanged" );
m_cbEditLayer->Clear();

View File

@ -23,6 +23,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <advanced_config.h>
#include <core/kicad_algo.h>
#include <dialogs/dialog_track_via_properties.h>
#include <pcb_layer_box_selector.h>
@ -57,7 +58,8 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
m_teardropWidthPercent( aParent, m_stWidthPercentLabel, m_tcWidthPercent, nullptr ),
m_teardropMaxWidth( aParent, m_stMaxWidthLabel, m_tcMaxWidth, m_stMaxWidthUnits ),
m_tracks( false ),
m_vias( false )
m_vias( false ),
m_editLayer( PADSTACK::ALL_LAYERS )
{
m_useCalculatedSize = true;
@ -229,8 +231,8 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
{
m_viaX.SetValue( v->GetPosition().x );
m_viaY.SetValue( v->GetPosition().y );
// TODO(JE) padstacks
m_viaDiameter.SetValue( v->GetWidth( PADSTACK::ALL_LAYERS ) );
m_viaStack = std::make_unique<PADSTACK>( v->Padstack() );
m_viaDiameter.SetValue( v->GetWidth( m_editLayer ) );
m_viaDrill.SetValue( v->GetDrillValue() );
m_vias = true;
viaType = v->GetViaType();
@ -267,7 +269,7 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
if( m_viaY.GetValue() != v->GetPosition().y )
m_viaY.SetValue( INDETERMINATE_STATE );
if( m_viaDiameter.GetValue() != v->GetWidth( PADSTACK::ALL_LAYERS ) )
if( m_viaDiameter.GetValue() != v->GetWidth( m_editLayer ) )
m_viaDiameter.SetValue( INDETERMINATE_STATE );
if( m_viaDrill.GetValue() != v->GetDrillValue() )
@ -426,6 +428,9 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
m_annularRingsLabel->Show( getLayerDepth() > 1 );
m_annularRingsCtrl->Show( getLayerDepth() > 1 );
m_sbPadstackSettings->Show( ADVANCED_CFG::GetCfg().m_EnableViaStacks );
afterPadstackModeChanged();
}
else
{
@ -577,6 +582,8 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
if( m_vias )
{
// TODO: This needs to move into the via class, not the dialog
if( !m_viaDiameter.Validate( GEOMETRY_MIN_SIZE, INT_MAX )
|| !m_viaDrill.Validate( GEOMETRY_MIN_SIZE, INT_MAX ) )
{
@ -599,6 +606,12 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
DisplayError( GetParent(), _( "Via start layer and end layer cannot be the same" ) );
return false;
}
if( !m_viaDiameter.IsIndeterminate() )
{
int diameter = m_viaDiameter.GetValue();
m_viaStack->SetSize( { diameter, diameter }, m_editLayer );
}
}
if( m_tracks )
@ -741,7 +754,12 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
v->SanitizeLayers();
if( !m_viaDiameter.IsIndeterminate() )
v->SetWidth( PADSTACK::ALL_LAYERS, m_viaDiameter.GetIntValue() );
{
if( ADVANCED_CFG::GetCfg().m_EnableViaStacks )
v->SetPadstack( *m_viaStack );
else
v->SetWidth( PADSTACK::ALL_LAYERS, m_viaDiameter.GetIntValue() );
}
if( !m_viaDrill.IsIndeterminate() )
v->SetDrill( m_viaDrill.GetIntValue() );
@ -900,6 +918,140 @@ void DIALOG_TRACK_VIA_PROPERTIES::onViaSelect( wxCommandEvent& aEvent )
}
void DIALOG_TRACK_VIA_PROPERTIES::onPadstackModeChanged( wxCommandEvent& aEvent )
{
wxCHECK_MSG( m_viaStack, /* void */, "Expected valid via stack in onPadstackModeChanged" );
switch( m_cbPadstackMode->GetSelection() )
{
default:
case 0: m_viaStack->SetMode( PADSTACK::MODE::NORMAL ); break;
case 1: m_viaStack->SetMode( PADSTACK::MODE::FRONT_INNER_BACK ); break;
case 2: m_viaStack->SetMode( PADSTACK::MODE::CUSTOM ); break;
}
afterPadstackModeChanged();
}
void DIALOG_TRACK_VIA_PROPERTIES::onEditLayerChanged( wxCommandEvent& aEvent )
{
wxCHECK_MSG( m_viaStack, /* void */, "Expected valid via stack in onEditLayerChanged" );
// Save data from the previous layer
if( !m_viaDiameter.IsIndeterminate() )
{
int diameter = m_viaDiameter.GetValue();
m_viaStack->SetSize( { diameter, diameter }, m_editLayer );
}
switch( m_viaStack->Mode() )
{
default:
case PADSTACK::MODE::NORMAL:
m_editLayer = PADSTACK::ALL_LAYERS;
break;
case PADSTACK::MODE::FRONT_INNER_BACK:
switch( m_cbEditLayer->GetSelection() )
{
default:
case 0: m_editLayer = F_Cu; break;
case 1: m_editLayer = PADSTACK::INNER_LAYERS; break;
case 2: m_editLayer = B_Cu; break;
}
break;
case PADSTACK::MODE::CUSTOM:
{
int layer = m_cbEditLayer->GetSelection();
if( layer < 0 )
layer = 0;
if( m_editLayerCtrlMap.contains( layer ) )
m_editLayer = m_editLayerCtrlMap.at( layer );
else
m_editLayer = F_Cu;
}
}
// Load controls with the current layer
m_viaDiameter.SetValue( m_viaStack->Size( m_editLayer ).x );
}
void DIALOG_TRACK_VIA_PROPERTIES::afterPadstackModeChanged()
{
// NOTE: synchronize changes here with DIALOG_PAD_PROPERTIES::afterPadstackModeChanged
wxCHECK_MSG( m_viaStack, /* void */, "Expected valid via stack in afterPadstackModeChanged" );
m_cbEditLayer->Clear();
BOARD* board = m_frame->GetBoard();
switch( m_viaStack->Mode() )
{
case PADSTACK::MODE::NORMAL:
m_cbPadstackMode->SetSelection( 0 );
m_cbEditLayer->Append( _( "All layers" ) );
m_cbEditLayer->Disable();
m_editLayer = PADSTACK::ALL_LAYERS;
m_editLayerCtrlMap = { { 0, PADSTACK::ALL_LAYERS } };
break;
case PADSTACK::MODE::FRONT_INNER_BACK:
{
m_cbPadstackMode->SetSelection( 1 );
m_cbEditLayer->Enable();
std::vector choices = {
board->GetLayerName( F_Cu ),
_( "Inner Layers" ),
board->GetLayerName( B_Cu )
};
m_cbEditLayer->Append( choices );
m_editLayerCtrlMap = {
{ 0, F_Cu },
{ 1, PADSTACK::INNER_LAYERS },
{ 2, B_Cu }
};
if( m_editLayer != F_Cu && m_editLayer != B_Cu )
m_editLayer = PADSTACK::INNER_LAYERS;
break;
}
case PADSTACK::MODE::CUSTOM:
{
m_cbPadstackMode->SetSelection( 2 );
m_cbEditLayer->Enable();
LSET layers = LSET::AllCuMask() & board->GetEnabledLayers();
for( PCB_LAYER_ID layer : layers.UIOrder() )
{
int idx = m_cbEditLayer->Append( board->GetLayerName( layer ) );
m_editLayerCtrlMap[idx] = layer;
}
break;
}
}
for( const auto& [idx, layer] : m_editLayerCtrlMap )
{
if( layer == m_editLayer )
{
m_cbEditLayer->SetSelection( idx );
break;
}
}
}
int DIALOG_TRACK_VIA_PROPERTIES::getLayerDepth()
{
int viaType = m_ViaTypeChoice->GetSelection();

View File

@ -31,6 +31,7 @@
class PCB_SELECTION;
class PCB_BASE_FRAME;
class PAD;
class PADSTACK;
class DIALOG_TRACK_VIA_PROPERTIES : public DIALOG_TRACK_VIA_PROPERTIES_BASE
{
@ -51,6 +52,8 @@ private:
void onTentingLinkToggle( wxCommandEvent& event ) override;
void onFrontTentingChanged( wxCommandEvent& event ) override;
void onTrackEdit( wxCommandEvent& aEvent ) override;
void onPadstackModeChanged( wxCommandEvent& aEvent ) override;
void onEditLayerChanged( wxCommandEvent& aEvent ) override;
void onUnitsChanged( wxCommandEvent& aEvent );
void onTeardropsUpdateUi( wxUpdateUIEvent& event ) override;
@ -58,6 +61,7 @@ private:
bool confirmPadChange( const std::vector<PAD*>& connectedPads );
int getLayerDepth();
void afterPadstackModeChanged();
private:
PCB_BASE_FRAME* m_frame;
@ -79,4 +83,11 @@ private:
bool m_tracks; // True if dialog displays any track properties.
bool m_vias; // True if dialog displays any via properties.
/// Temporary padstack of the edited via(s)
std::unique_ptr<PADSTACK> m_viaStack;
/// The currently-shown copper layer of the edited via(s)
PCB_LAYER_ID m_editLayer;
std::map<int, PCB_LAYER_ID> m_editLayerCtrlMap;
};

View File

@ -274,27 +274,51 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_predefinedViaSizesUnits->Wrap( -1 );
gbSizer3->Add( m_predefinedViaSizesUnits, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
m_sbPadstackSettings = new wxBoxSizer( wxHORIZONTAL );
m_stPadstackMode = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Padstack mode:"), wxDefaultPosition, wxDefaultSize, 0 );
m_stPadstackMode->Wrap( -1 );
m_sbPadstackSettings->Add( m_stPadstackMode, 0, wxALIGN_CENTER_VERTICAL, 5 );
wxString m_cbPadstackModeChoices[] = { _("Normal"), _("Front/Inner/Back"), _("Custom") };
int m_cbPadstackModeNChoices = sizeof( m_cbPadstackModeChoices ) / sizeof( wxString );
m_cbPadstackMode = new wxChoice( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_cbPadstackModeNChoices, m_cbPadstackModeChoices, 0 );
m_cbPadstackMode->SetSelection( 0 );
m_sbPadstackSettings->Add( m_cbPadstackMode, 0, wxALL, 5 );
m_stEditLayer = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Edit layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_stEditLayer->Wrap( -1 );
m_sbPadstackSettings->Add( m_stEditLayer, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
wxArrayString m_cbEditLayerChoices;
m_cbEditLayer = new wxChoice( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_cbEditLayerChoices, 0 );
m_cbEditLayer->SetSelection( 0 );
m_sbPadstackSettings->Add( m_cbEditLayer, 0, wxALL, 5 );
gbSizer3->Add( m_sbPadstackSettings, wxGBPosition( 2, 0 ), wxGBSpan( 1, 3 ), wxEXPAND, 0 );
m_ViaDiameterLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Via diameter:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterLabel->Wrap( -1 );
gbSizer3->Add( m_ViaDiameterLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxLEFT|wxALIGN_CENTER_VERTICAL, 1 );
gbSizer3->Add( m_ViaDiameterLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxLEFT|wxALIGN_CENTER_VERTICAL, 1 );
m_ViaDiameterCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
gbSizer3->Add( m_ViaDiameterCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
gbSizer3->Add( m_ViaDiameterCtrl, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDiameterUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterUnit->Wrap( -1 );
gbSizer3->Add( m_ViaDiameterUnit, wxGBPosition( 2, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbSizer3->Add( m_ViaDiameterUnit, wxGBPosition( 3, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
m_ViaDrillLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Via hole:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillLabel->Wrap( -1 );
gbSizer3->Add( m_ViaDrillLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
gbSizer3->Add( m_ViaDrillLabel, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
m_ViaDrillCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
gbSizer3->Add( m_ViaDrillCtrl, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
gbSizer3->Add( m_ViaDrillCtrl, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDrillUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillUnit->Wrap( -1 );
gbSizer3->Add( m_ViaDrillUnit, wxGBPosition( 3, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbSizer3->Add( m_ViaDrillUnit, wxGBPosition( 4, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbSizer3->AddGrowableCol( 1 );
@ -659,9 +683,10 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_viaNotFree->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNotFreeClicked ), NULL, this );
m_predefinedTrackWidthsCtrl->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onWidthSelect ), NULL, this );
m_TrackWidthCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onWidthEdit ), NULL, this );
m_TrackLayerCtrl->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackEdit ), NULL, this );
m_trackHasSolderMask->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackEdit ), NULL, this );
m_predefinedViaSizesCtrl->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaSelect ), NULL, this );
m_cbPadstackMode->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onPadstackModeChanged ), NULL, this );
m_cbEditLayer->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onEditLayerChanged ), NULL, this );
m_ViaDiameterCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );
m_ViaDrillCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );
m_ViaTypeChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );
@ -701,9 +726,10 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::~DIALOG_TRACK_VIA_PROPERTIES_BASE()
m_viaNotFree->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNotFreeClicked ), NULL, this );
m_predefinedTrackWidthsCtrl->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onWidthSelect ), NULL, this );
m_TrackWidthCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onWidthEdit ), NULL, this );
m_TrackLayerCtrl->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackEdit ), NULL, this );
m_trackHasSolderMask->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackEdit ), NULL, this );
m_predefinedViaSizesCtrl->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaSelect ), NULL, this );
m_cbPadstackMode->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onPadstackModeChanged ), NULL, this );
m_cbEditLayer->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onEditLayerChanged ), NULL, this );
m_ViaDiameterCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );
m_ViaDrillCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );
m_ViaTypeChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaEdit ), NULL, this );

View File

@ -2637,12 +2637,282 @@
<property name="wrap">-1</property>
</object>
</object>
<object class="gbsizeritem" expanded="true">
<property name="border">0</property>
<property name="colspan">3</property>
<property name="column">0</property>
<property name="flag">wxEXPAND</property>
<property name="row">2</property>
<property name="rowspan">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">m_sbPadstackSettings</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">protected</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Padstack mode:</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_stPadstackMode</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices">&quot;Normal&quot; &quot;Front/Inner/Back&quot; &quot;Custom&quot;</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbPadstackMode</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChoice">onPadstackModeChanged</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Edit layer:</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_stEditLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbEditLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChoice">onEditLayerChanged</event>
</object>
</object>
</object>
</object>
<object class="gbsizeritem" expanded="true">
<property name="border">1</property>
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxLEFT|wxALIGN_CENTER_VERTICAL</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="false">
<property name="BottomDockable">1</property>
@ -2707,7 +2977,7 @@
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxTextCtrl" expanded="false">
<property name="BottomDockable">1</property>
@ -2776,7 +3046,7 @@
<property name="colspan">1</property>
<property name="column">2</property>
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="false">
<property name="BottomDockable">1</property>
@ -2841,7 +3111,7 @@
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
<property name="row">3</property>
<property name="row">4</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="false">
<property name="BottomDockable">1</property>
@ -2906,7 +3176,7 @@
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
<property name="row">3</property>
<property name="row">4</property>
<property name="rowspan">1</property>
<object class="wxTextCtrl" expanded="false">
<property name="BottomDockable">1</property>
@ -2975,7 +3245,7 @@
<property name="colspan">1</property>
<property name="column">2</property>
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
<property name="row">3</property>
<property name="row">4</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="false">
<property name="BottomDockable">1</property>

View File

@ -92,6 +92,11 @@ class DIALOG_TRACK_VIA_PROPERTIES_BASE : public DIALOG_SHIM
wxStaticText* m_predefinedViaSizesLabel;
wxChoice* m_predefinedViaSizesCtrl;
wxStaticText* m_predefinedViaSizesUnits;
wxBoxSizer* m_sbPadstackSettings;
wxStaticText* m_stPadstackMode;
wxChoice* m_cbPadstackMode;
wxStaticText* m_stEditLayer;
wxChoice* m_cbEditLayer;
wxStaticText* m_ViaDiameterLabel;
wxTextCtrl* m_ViaDiameterCtrl;
wxStaticText* m_ViaDiameterUnit;
@ -144,6 +149,8 @@ class DIALOG_TRACK_VIA_PROPERTIES_BASE : public DIALOG_SHIM
virtual void onWidthEdit( wxCommandEvent& event ) { event.Skip(); }
virtual void onTrackEdit( wxCommandEvent& event ) { event.Skip(); }
virtual void onViaSelect( wxCommandEvent& event ) { event.Skip(); }
virtual void onPadstackModeChanged( wxCommandEvent& event ) { event.Skip(); }
virtual void onEditLayerChanged( wxCommandEvent& event ) { event.Skip(); }
virtual void onViaEdit( wxCommandEvent& event ) { event.Skip(); }
virtual void onFrontTentingChanged( wxCommandEvent& event ) { event.Skip(); }
virtual void onTentingLinkToggle( wxCommandEvent& event ) { event.Skip(); }

View File

@ -772,9 +772,7 @@ void PADSTACK::SetMode( MODE aMode )
if( m_mode == aMode )
return;
m_mode = aMode;
switch( m_mode )
switch( aMode )
{
case MODE::NORMAL:
std::erase_if( m_copperProps,
@ -786,16 +784,30 @@ void PADSTACK::SetMode( MODE aMode )
break;
case MODE::FRONT_INNER_BACK:
m_copperProps[INNER_LAYERS] = m_copperProps[ALL_LAYERS];
m_copperProps[B_Cu] = m_copperProps[ALL_LAYERS];
// When coming from normal, these layers may be missing or have junk values
if( m_mode == MODE::NORMAL )
{
m_copperProps[INNER_LAYERS] = m_copperProps[ALL_LAYERS];
m_copperProps[B_Cu] = m_copperProps[ALL_LAYERS];
}
break;
case MODE::CUSTOM:
for( PCB_LAYER_ID layer : LAYER_RANGE( In1_Cu, B_Cu, MAX_CU_LAYERS ) )
m_copperProps[layer] = m_copperProps[ALL_LAYERS];
{
PCB_LAYER_ID innerLayerTemplate = ( m_mode == MODE::NORMAL ) ? ALL_LAYERS : INNER_LAYERS;
for( PCB_LAYER_ID layer : LAYER_RANGE( In1_Cu, In30_Cu, MAX_CU_LAYERS ) )
m_copperProps[layer] = m_copperProps[innerLayerTemplate];
if( m_mode == MODE::NORMAL )
m_copperProps[B_Cu] = m_copperProps[ALL_LAYERS];
break;
}
}
m_mode = aMode;
// Changing mode invalidates cached shapes
// TODO(JE) clean this up -- maybe PADSTACK should own shape caches