From df0de2b0598e6da3fdef2894eb77295ad8728d3b Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Wed, 2 Oct 2024 23:10:38 -0400 Subject: [PATCH] Expose padstack editing in Pad Properties dialog --- pcbnew/dialogs/dialog_pad_properties.cpp | 503 +++-- pcbnew/dialogs/dialog_pad_properties.h | 6 + pcbnew/dialogs/dialog_pad_properties_base.cpp | 127 +- pcbnew/dialogs/dialog_pad_properties_base.fbp | 1787 ++++++++++------- pcbnew/dialogs/dialog_pad_properties_base.h | 35 +- pcbnew/padstack.cpp | 29 + 6 files changed, 1476 insertions(+), 1011 deletions(-) diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index 95cddd52e0..a1adf8affd 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -110,9 +110,9 @@ static PAD_ATTRIB code_type[] = * @brief Returns true if the pad's rounding ratio is valid (i.e. the pad * has a shape where that is meaningful) */ -static bool PadHasMeaningfulRoundingRadius( const PAD& aPad ) +static bool PadHasMeaningfulRoundingRadius( const PAD& aPad, PCB_LAYER_ID aLayer ) { - const PAD_SHAPE shape = aPad.GetShape( PADSTACK::ALL_LAYERS ); + const PAD_SHAPE shape = aPad.GetShape( aLayer ); return shape == PAD_SHAPE::ROUNDRECT || shape == PAD_SHAPE::CHAMFERED_RECT; } @@ -122,12 +122,13 @@ static bool PadHasMeaningfulRoundingRadius( const PAD& aPad ) * * According to IPC-7351C, this is 25%, or 0.25mm, whichever is smaller */ -static double GetDefaultIpcRoundingRatio( const PAD& aPad ) +static double GetDefaultIpcRoundingRatio( const PAD& aPad, PCB_LAYER_ID aLayer ) { const double defaultProportion = 0.25; const double minimumSizeIU = pcbIUScale.mmToIU( 0.25 ); - const int padMinSizeIU = std::min( aPad.GetSizeX(), aPad.GetSizeY() ); + const VECTOR2I& size = aPad.GetSize( aLayer ); + const int padMinSizeIU = std::min( size.x, size.y ); const double defaultRadiusIU = std::min( minimumSizeIU, padMinSizeIU * defaultProportion ); // Convert back to a ratio @@ -148,6 +149,7 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad DIALOG_PAD_PROPERTIES_BASE( aParent ), m_parent( aParent ), m_initialized( false ), + m_editLayer( F_Cu ), m_posX( aParent, m_posXLabel, m_posXCtrl, m_posXUnits ), m_posY( aParent, m_posYLabel, m_posYCtrl, m_posYUnits ), m_sizeX( aParent, m_sizeXLabel, m_sizeXCtrl, m_sizeXUnits ), @@ -217,13 +219,18 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad m_previewPad->GetTeardropParams() = m_masterPad->GetTeardropParams(); } + // TODO(JE) padstacks: should this be re-run when pad mode changes? // Pads have a hardcoded internal rounding ratio which is 0.25 by default, even if // they're not a rounded shape. This makes it hard to detect an intentional 0.25 // ratio, or one that's only there because it's the PAD default. // Zero it out here to mark that we should recompute a better ratio if the user // selects a pad shape which would need a default rounding ratio computed for it - if( !PadHasMeaningfulRoundingRadius( *m_previewPad ) ) - m_previewPad->SetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS, 0.0 ); + m_previewPad->Padstack().ForEachUniqueLayer( + [&]( PCB_LAYER_ID aLayer ) + { + if( !PadHasMeaningfulRoundingRadius( *m_previewPad, aLayer ) ) + m_previewPad->SetRoundRectRadiusRatio( aLayer, 0.0 ); + } ); if( m_isFpEditor ) { @@ -278,12 +285,12 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad switch( m_page ) { + default: case 0: SetInitialFocus( m_padNumCtrl ); break; case 1: SetInitialFocus( m_thermalGapCtrl ); break; case 2: SetInitialFocus( m_clearanceCtrl ); break; } - SetInitialFocus( m_padNumCtrl ); SetupStandardButtons(); m_initialized = true; @@ -406,23 +413,81 @@ void DIALOG_PAD_PROPERTIES::prepareCanvas() } +void DIALOG_PAD_PROPERTIES::OnPadstackModeChanged( wxCommandEvent& aEvent ) +{ + switch( m_cbPadstackMode->GetSelection() ) + { + default: + case 0: m_previewPad->Padstack().SetMode( PADSTACK::MODE::NORMAL ); break; + case 1: m_previewPad->Padstack().SetMode( PADSTACK::MODE::FRONT_INNER_BACK ); break; + case 2: m_previewPad->Padstack().SetMode( PADSTACK::MODE::CUSTOM ); break; + } + + afterPadstackModeChanged(); + transferDataToPad( m_previewPad ); + redraw(); +} + + +void DIALOG_PAD_PROPERTIES::OnEditLayerChanged( wxCommandEvent& aEvent ) +{ + // Save data from the previous layer + transferDataToPad( m_previewPad ); + + switch( m_previewPad->Padstack().Mode() ) + { + default: + case PADSTACK::MODE::NORMAL: + m_editLayer = F_Cu; + 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 + initPadstackLayerValues(); + redraw(); +} + + void DIALOG_PAD_PROPERTIES::updateRoundRectCornerValues() { // Note: use ChangeValue() to avoid generating a wxEVT_TEXT event - m_cornerRadius.ChangeValue( m_previewPad->GetRoundRectCornerRadius( PADSTACK::ALL_LAYERS ) ); + m_cornerRadius.ChangeValue( m_previewPad->GetRoundRectCornerRadius( m_editLayer ) ); - m_cornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); - m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); + m_cornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) * 100.0 ); + m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) * 100.0 ); - m_chamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); - m_mixedChamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); + m_chamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( m_editLayer ) * 100.0 ); + m_mixedChamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( m_editLayer ) * 100.0 ); } void DIALOG_PAD_PROPERTIES::onCornerRadiusChange( wxCommandEvent& event ) { - if( m_previewPad->GetShape( PADSTACK::ALL_LAYERS ) != PAD_SHAPE::ROUNDRECT - && m_previewPad->GetShape( PADSTACK::ALL_LAYERS ) != PAD_SHAPE::CHAMFERED_RECT ) + if( m_previewPad->GetShape( m_editLayer ) != PAD_SHAPE::ROUNDRECT + && m_previewPad->GetShape( m_editLayer ) != PAD_SHAPE::CHAMFERED_RECT ) { return; } @@ -432,10 +497,10 @@ void DIALOG_PAD_PROPERTIES::onCornerRadiusChange( wxCommandEvent& event ) if( transferDataToPad( m_previewPad ) ) { - m_previewPad->SetRoundRectCornerRadius( PADSTACK::ALL_LAYERS, m_cornerRadius.GetValue() ); + m_previewPad->SetRoundRectCornerRadius( m_editLayer, m_cornerRadius.GetValue() ); - m_cornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); - m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); + m_cornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) * 100.0 ); + m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) * 100.0 ); redraw(); } @@ -447,8 +512,8 @@ void DIALOG_PAD_PROPERTIES::onCornerRadiusChange( wxCommandEvent& event ) void DIALOG_PAD_PROPERTIES::onCornerSizePercentChange( wxCommandEvent& event ) { - if( m_previewPad->GetShape( PADSTACK::ALL_LAYERS ) != PAD_SHAPE::ROUNDRECT - && m_previewPad->GetShape( PADSTACK::ALL_LAYERS ) != PAD_SHAPE::CHAMFERED_RECT ) + if( m_previewPad->GetShape( m_editLayer ) != PAD_SHAPE::ROUNDRECT + && m_previewPad->GetShape( m_editLayer ) != PAD_SHAPE::CHAMFERED_RECT ) { return; } @@ -511,7 +576,7 @@ void DIALOG_PAD_PROPERTIES::onCornerSizePercentChange( wxCommandEvent& event ) } if( changed && transferDataToPad( m_previewPad ) ) - m_cornerRadius.ChangeValue( m_previewPad->GetRoundRectCornerRadius( PADSTACK::ALL_LAYERS ) ); + m_cornerRadius.ChangeValue( m_previewPad->GetRoundRectCornerRadius( m_editLayer ) ); redraw(); @@ -598,7 +663,7 @@ void DIALOG_PAD_PROPERTIES::initValues() } } - m_primitives = m_previewPad->GetPrimitives( PADSTACK::ALL_LAYERS ); + afterPadstackModeChanged(); m_padNetSelector->SetSelectedNetcode( m_previewPad->GetNetCode() ); @@ -609,28 +674,13 @@ void DIALOG_PAD_PROPERTIES::initValues() m_holeX.ChangeValue( m_previewPad->GetDrillSize().x ); m_holeY.ChangeValue( m_previewPad->GetDrillSize().y ); - m_sizeX.ChangeValue( m_previewPad->GetSize( PADSTACK::ALL_LAYERS ).x ); - m_sizeY.ChangeValue( m_previewPad->GetSize( PADSTACK::ALL_LAYERS ).y ); - - m_offsetShapeOpt->SetValue( m_previewPad->GetOffset( PADSTACK::ALL_LAYERS ) != VECTOR2I() ); - m_offsetX.ChangeValue( m_previewPad->GetOffset( PADSTACK::ALL_LAYERS ).x ); - m_offsetY.ChangeValue( m_previewPad->GetOffset( PADSTACK::ALL_LAYERS ).y ); - - if( m_previewPad->GetDelta( PADSTACK::ALL_LAYERS ).x ) - { - m_trapDelta.ChangeValue( m_previewPad->GetDelta( PADSTACK::ALL_LAYERS ).x ); - m_trapAxisCtrl->SetSelection( 0 ); - } - else - { - m_trapDelta.ChangeValue( m_previewPad->GetDelta( PADSTACK::ALL_LAYERS ).y ); - m_trapAxisCtrl->SetSelection( 1 ); - } - + // TODO(JE) padstacks -- does this need to be saved/restored every time the layer changes? // Store the initial thermal spoke angle to restore it, because some initializations // can change this value (mainly after m_PadShapeSelector initializations) EDA_ANGLE spokeInitialAngle = m_previewPad->GetThermalSpokeAngle(); + initPadstackLayerValues(); + m_padToDieOpt->SetValue( m_previewPad->GetPadToDieLength() != 0 ); m_padToDie.ChangeValue( m_previewPad->GetPadToDieLength() ); @@ -684,43 +734,6 @@ void DIALOG_PAD_PROPERTIES::initValues() else m_ZoneCustomPadShape->SetSelection( 0 ); - switch( m_previewPad->GetShape( PADSTACK::ALL_LAYERS ) ) - { - default: - case PAD_SHAPE::CIRCLE: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CIRCLE ); break; - case PAD_SHAPE::OVAL: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_OVAL ); break; - case PAD_SHAPE::RECTANGLE: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_RECT ); break; - case PAD_SHAPE::TRAPEZOID: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_TRAPEZOID ); break; - case PAD_SHAPE::ROUNDRECT: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_ROUNDRECT ); break; - - case PAD_SHAPE::CHAMFERED_RECT: - if( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) > 0.0 ) - m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CHAMFERED_ROUNDED_RECT ); - else - m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CHAMFERED_RECT ); - break; - - case PAD_SHAPE::CUSTOM: - if( m_previewPad->GetAnchorPadShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::RECTANGLE ) - m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CUSTOM_RECT_ANCHOR ); - else - m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CUSTOM_CIRC_ANCHOR ); - break; - } - - int chamferPositions = m_previewPad->GetChamferPositions( PADSTACK::ALL_LAYERS ); - - m_cbTopLeft->SetValue( chamferPositions & RECT_CHAMFER_TOP_LEFT ); - m_cbTopLeft1->SetValue( chamferPositions & RECT_CHAMFER_TOP_LEFT ); - m_cbTopRight->SetValue( chamferPositions & RECT_CHAMFER_TOP_RIGHT ); - m_cbTopRight1->SetValue( chamferPositions & RECT_CHAMFER_TOP_RIGHT ); - m_cbBottomLeft->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_LEFT ); - m_cbBottomLeft1->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_LEFT ); - m_cbBottomRight->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_RIGHT ); - m_cbBottomRight1->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_RIGHT ); - - updateRoundRectCornerValues(); - // Type of pad selection bool aperture = m_previewPad->GetAttribute() == PAD_ATTRIB::SMD && m_previewPad->IsAperturePad(); @@ -779,6 +792,134 @@ void DIALOG_PAD_PROPERTIES::initValues() } +void DIALOG_PAD_PROPERTIES::initPadstackLayerValues() +{ + m_primitives = m_previewPad->GetPrimitives( m_editLayer ); + + m_sizeX.ChangeValue( m_previewPad->GetSize( m_editLayer ).x ); + m_sizeY.ChangeValue( m_previewPad->GetSize( m_editLayer ).y ); + + m_offsetShapeOpt->SetValue( m_previewPad->GetOffset( m_editLayer ) != VECTOR2I() ); + m_offsetX.ChangeValue( m_previewPad->GetOffset( m_editLayer ).x ); + m_offsetY.ChangeValue( m_previewPad->GetOffset( m_editLayer ).y ); + + if( m_previewPad->GetDelta( m_editLayer ).x ) + { + m_trapDelta.ChangeValue( m_previewPad->GetDelta( m_editLayer ).x ); + m_trapAxisCtrl->SetSelection( 0 ); + } + else + { + m_trapDelta.ChangeValue( m_previewPad->GetDelta( m_editLayer ).y ); + m_trapAxisCtrl->SetSelection( 1 ); + } + + switch( m_previewPad->GetShape( m_editLayer ) ) + { + default: + case PAD_SHAPE::CIRCLE: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CIRCLE ); break; + case PAD_SHAPE::OVAL: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_OVAL ); break; + case PAD_SHAPE::RECTANGLE: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_RECT ); break; + case PAD_SHAPE::TRAPEZOID: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_TRAPEZOID ); break; + case PAD_SHAPE::ROUNDRECT: m_PadShapeSelector->SetSelection( CHOICE_SHAPE_ROUNDRECT ); break; + + case PAD_SHAPE::CHAMFERED_RECT: + if( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) > 0.0 ) + m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CHAMFERED_ROUNDED_RECT ); + else + m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CHAMFERED_RECT ); + break; + + case PAD_SHAPE::CUSTOM: + if( m_previewPad->GetAnchorPadShape( m_editLayer ) == PAD_SHAPE::RECTANGLE ) + m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CUSTOM_RECT_ANCHOR ); + else + m_PadShapeSelector->SetSelection( CHOICE_SHAPE_CUSTOM_CIRC_ANCHOR ); + break; + } + + int chamferPositions = m_previewPad->GetChamferPositions( m_editLayer ); + + m_cbTopLeft->SetValue( chamferPositions & RECT_CHAMFER_TOP_LEFT ); + m_cbTopLeft1->SetValue( chamferPositions & RECT_CHAMFER_TOP_LEFT ); + m_cbTopRight->SetValue( chamferPositions & RECT_CHAMFER_TOP_RIGHT ); + m_cbTopRight1->SetValue( chamferPositions & RECT_CHAMFER_TOP_RIGHT ); + m_cbBottomLeft->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_LEFT ); + m_cbBottomLeft1->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_LEFT ); + m_cbBottomRight->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_RIGHT ); + m_cbBottomRight1->SetValue( chamferPositions & RECT_CHAMFER_BOTTOM_RIGHT ); + + updateRoundRectCornerValues(); +} + + +void DIALOG_PAD_PROPERTIES::afterPadstackModeChanged() +{ + wxCHECK_MSG( m_board, /* void */, "Expected valid board in afterPadstackModeChanged" ); + m_cbEditLayer->Clear(); + + switch( m_previewPad->Padstack().Mode() ) + { + case PADSTACK::MODE::NORMAL: + m_cbPadstackMode->SetSelection( 0 ); + m_cbEditLayer->Append( m_board->GetLayerName( F_Cu ) ); + m_cbEditLayer->Disable(); + m_editLayer = F_Cu; + m_editLayerCtrlMap = { { 0, F_Cu } }; + break; + + case PADSTACK::MODE::FRONT_INNER_BACK: + { + m_cbPadstackMode->SetSelection( 1 ); + m_cbEditLayer->Enable(); + + std::vector choices = { + m_board->GetLayerName( F_Cu ), + _( "Inner Layers" ), + m_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() & m_board->GetEnabledLayers(); + + for( PCB_LAYER_ID layer : layers.UIOrder() ) + { + int idx = m_cbEditLayer->Append( m_board->GetLayerName( layer ) ); + m_editLayerCtrlMap[idx] = layer; + } + + break; + } + } + + for( const auto& [idx, layer] : m_editLayerCtrlMap ) + { + if( layer == m_editLayer ) + { + m_cbEditLayer->SetSelection( idx ); + break; + } + } +} + + void DIALOG_PAD_PROPERTIES::OnResize( wxSizeEvent& event ) { redraw(); @@ -822,8 +963,11 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event ) m_shapePropsBook->SetSelection( 2 ); // Reasonable defaults - if( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) == 0.0 ) - m_cornerRatio.ChangeDoubleValue( GetDefaultIpcRoundingRatio( *m_previewPad ) * 100 ); + if( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) == 0.0 ) + { + m_cornerRatio.ChangeDoubleValue( + GetDefaultIpcRoundingRatio( *m_previewPad, m_editLayer ) * 100 ); + } break; } @@ -832,11 +976,11 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event ) m_shapePropsBook->SetSelection( 3 ); // Reasonable default - if( m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) == 0.0 ) - m_previewPad->SetChamferRectRatio( PADSTACK::ALL_LAYERS, 0.2 ); + if( m_previewPad->GetChamferRectRatio( m_editLayer ) == 0.0 ) + m_previewPad->SetChamferRectRatio( m_editLayer, 0.2 ); // Ensure the displayed value is up to date: - m_chamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); + m_chamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( m_editLayer ) * 100.0 ); // A reasonable default is one corner chamfered (usual for some SMD pads). if( !m_cbTopLeft->GetValue() && !m_cbTopRight->GetValue() @@ -854,17 +998,17 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event ) m_shapePropsBook->SetSelection( 4 ); // Reasonable defaults - if( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) == 0.0 - && m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) == 0.0 ) + if( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) == 0.0 + && m_previewPad->GetChamferRectRatio( m_editLayer ) == 0.0 ) { - m_previewPad->SetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS, - GetDefaultIpcRoundingRatio( *m_previewPad ) ); - m_previewPad->SetChamferRectRatio( PADSTACK::ALL_LAYERS, 0.2 ); + m_previewPad->SetRoundRectRadiusRatio( + m_editLayer, GetDefaultIpcRoundingRatio( *m_previewPad, m_editLayer ) ); + m_previewPad->SetChamferRectRatio( m_editLayer, 0.2 ); } // Ensure the displayed values are up to date: - m_mixedChamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); - m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) * 100.0 ); + m_mixedChamferRatio.ChangeDoubleValue( m_previewPad->GetChamferRectRatio( m_editLayer ) * 100.0 ); + m_mixedCornerRatio.ChangeDoubleValue( m_previewPad->GetRoundRectRadiusRatio( m_editLayer ) * 100.0 ); break; case CHOICE_SHAPE_CUSTOM_CIRC_ANCHOR: // PAD_SHAPE::CUSTOM, circular anchor @@ -951,7 +1095,7 @@ void DIALOG_PAD_PROPERTIES::UpdateLayersDropdown() case PTH_DLG_TYPE: m_rbCopperLayersSel->Append( _( "All copper layers" ) ); m_rbCopperLayersSel->Append( wxString::Format( _( "%s, %s and connected layers" ), - m_board->GetLayerName( PADSTACK::ALL_LAYERS ), + m_board->GetLayerName( F_Cu ), m_board->GetLayerName( B_Cu ) ) ); m_rbCopperLayersSel->Append( _( "Connected layers only" ) ); m_rbCopperLayersSel->Append( _( "None" ) ); @@ -959,16 +1103,16 @@ void DIALOG_PAD_PROPERTIES::UpdateLayersDropdown() case NPTH_DLG_TYPE: m_rbCopperLayersSel->Append( wxString::Format( _( "%s and %s" ), - m_board->GetLayerName( PADSTACK::ALL_LAYERS ), + m_board->GetLayerName( F_Cu ), m_board->GetLayerName( B_Cu ) ) ); - m_rbCopperLayersSel->Append( m_board->GetLayerName( PADSTACK::ALL_LAYERS ) ); + m_rbCopperLayersSel->Append( m_board->GetLayerName( F_Cu ) ); m_rbCopperLayersSel->Append( m_board->GetLayerName( B_Cu ) ); m_rbCopperLayersSel->Append( _( "None" ) ); break; case SMD_DLG_TYPE: case CONN_DLG_TYPE: - m_rbCopperLayersSel->Append( m_board->GetLayerName( PADSTACK::ALL_LAYERS ) ); + m_rbCopperLayersSel->Append( m_board->GetLayerName( F_Cu ) ); m_rbCopperLayersSel->Append( m_board->GetLayerName( B_Cu ) ); break; @@ -1038,6 +1182,16 @@ void DIALOG_PAD_PROPERTIES::PadTypeSelected( wxCommandEvent& event ) transferDataToPad( m_previewPad ); + // For now, padstack controls only enabled for PTH pads + bool enablePadstack = m_padType->GetSelection() == PTH_DLG_TYPE; + m_padstackControls->Show( enablePadstack ); + + if( !enablePadstack ) + { + m_editLayer = F_Cu; + afterPadstackModeChanged(); + } + // Layout adjustment is needed if the hole details got shown/hidden m_LeftBoxSizer->Layout(); redraw(); @@ -1108,9 +1262,9 @@ void DIALOG_PAD_PROPERTIES::OnUpdateUI( wxUpdateUIEvent& event ) break; case NPTH_DLG_TYPE: - if( cu_set.test( PADSTACK::ALL_LAYERS ) && cu_set.test( B_Cu ) ) + if( cu_set.test( F_Cu ) && cu_set.test( B_Cu ) ) m_stackupImagesBook->SetSelection( 4 ); - else if( cu_set.test( PADSTACK::ALL_LAYERS ) ) + else if( cu_set.test( F_Cu ) ) m_stackupImagesBook->SetSelection( 5 ); else if( cu_set.test( B_Cu ) ) m_stackupImagesBook->SetSelection( 6 ); @@ -1175,7 +1329,7 @@ void DIALOG_PAD_PROPERTIES::updatePadLayersList( LSET layer_mask, bool remove_un if( !layer_mask.any() ) layer_mask = PAD::SMDMask(); - if( layer_mask.test( PADSTACK::ALL_LAYERS ) ) + if( layer_mask.test( F_Cu ) ) m_rbCopperLayersSel->SetSelection( 0 ); else m_rbCopperLayersSel->SetSelection( 1 ); @@ -1186,7 +1340,7 @@ void DIALOG_PAD_PROPERTIES::updatePadLayersList( LSET layer_mask, bool remove_un if( !layer_mask.any() ) layer_mask = PAD::ConnSMDMask(); - if( layer_mask.test( PADSTACK::ALL_LAYERS ) ) + if( layer_mask.test( F_Cu ) ) m_rbCopperLayersSel->SetSelection( 0 ); else m_rbCopperLayersSel->SetSelection( 1 ); @@ -1197,9 +1351,9 @@ void DIALOG_PAD_PROPERTIES::updatePadLayersList( LSET layer_mask, bool remove_un if( !layer_mask.any() ) layer_mask = PAD::UnplatedHoleMask(); - if( layer_mask.test( PADSTACK::ALL_LAYERS ) && layer_mask.test( B_Cu ) ) + if( layer_mask.test( F_Cu ) && layer_mask.test( B_Cu ) ) m_rbCopperLayersSel->SetSelection( 0 ); - else if( layer_mask.test( PADSTACK::ALL_LAYERS ) ) + else if( layer_mask.test( F_Cu ) ) m_rbCopperLayersSel->SetSelection( 1 ); else if( layer_mask.test( B_Cu ) ) m_rbCopperLayersSel->SetSelection( 2 ); @@ -1332,9 +1486,21 @@ void DIALOG_PAD_PROPERTIES::redraw() // we use here a layer never used in a pad: #define SELECTED_ITEMS_LAYER Dwgs_User + view->ClearTopLayers(); view->SetTopLayer( SELECTED_ITEMS_LAYER ); + view->SetTopLayer( m_editLayer ); settings->SetLayerColor( SELECTED_ITEMS_LAYER, m_selectedColor ); + static const std::vector topLayers = { + LAYER_PAD_PLATEDHOLES, + LAYER_PAD_HOLEWALLS, + LAYER_NON_PLATEDHOLES, + LAYER_PAD_NETNAMES + }; + + for( int layer : topLayers ) + view->SetTopLayer( layer ); + m_axisOrigin->SetPosition( m_previewPad->GetPosition() ); view->Update( m_previewPad ); @@ -1425,35 +1591,15 @@ bool DIALOG_PAD_PROPERTIES::TransferDataFromWindow() commit.Modify( m_currentPad ); // Update values - // TODO(JE) padstacks - a lot of the below can be removed; SetPadstack should handle it - m_currentPad->SetShape( PADSTACK::ALL_LAYERS, m_masterPad->GetShape( PADSTACK::ALL_LAYERS ) ); - m_currentPad->SetAttribute( m_masterPad->GetAttribute() ); - m_currentPad->SetFPRelativeOrientation( m_masterPad->GetOrientation() ); - - m_currentPad->SetSize( PADSTACK::ALL_LAYERS, m_masterPad->GetSize( PADSTACK::ALL_LAYERS ) ); - VECTOR2I size = m_masterPad->GetDelta( PADSTACK::ALL_LAYERS ); - m_currentPad->SetDelta( PADSTACK::ALL_LAYERS, size ); - - m_currentPad->SetDrillSize( m_masterPad->GetDrillSize() ); - m_currentPad->SetDrillShape( m_masterPad->GetDrillShape() ); - - VECTOR2I offset = m_masterPad->GetOffset( PADSTACK::ALL_LAYERS ); - m_currentPad->SetOffset( PADSTACK::ALL_LAYERS, offset ); + // transferDataToPad only handles the current edit layer, so m_masterPad isn't accurate + // TODO(JE) this could be cleaner + m_currentPad->SetPadstack( m_previewPad->Padstack() ); + m_currentPad->SetAttribute( m_masterPad->GetAttribute() ); + m_currentPad->SetFPRelativeOrientation( m_masterPad->GetOrientation() ); m_currentPad->SetPadToDieLength( m_masterPad->GetPadToDieLength() ); - - if( m_masterPad->GetShape( PADSTACK::ALL_LAYERS ) != PAD_SHAPE::CUSTOM ) - m_masterPad->DeletePrimitivesList(); - - m_currentPad->SetAnchorPadShape( PADSTACK::ALL_LAYERS, - m_masterPad->GetAnchorPadShape( PADSTACK::ALL_LAYERS ) ); - m_currentPad->ReplacePrimitives( PADSTACK::ALL_LAYERS, - m_masterPad->GetPrimitives( PADSTACK::ALL_LAYERS ) ); - - m_currentPad->SetPadstack( m_masterPad->Padstack() ); m_currentPad->SetLayerSet( m_masterPad->GetLayerSet() ); - m_currentPad->SetNumber( m_masterPad->GetNumber() ); int padNetcode = NETINFO_LIST::UNCONNECTED; @@ -1463,31 +1609,9 @@ bool DIALOG_PAD_PROPERTIES::TransferDataFromWindow() padNetcode = m_padNetSelector->GetSelectedNetcode(); m_currentPad->SetNetCode( padNetcode ); - m_currentPad->SetLocalClearance( m_masterPad->GetLocalClearance() ); - m_currentPad->SetLocalSolderMaskMargin( m_masterPad->GetLocalSolderMaskMargin() ); - m_currentPad->SetLocalSolderPasteMargin( m_masterPad->GetLocalSolderPasteMargin() ); - m_currentPad->SetLocalSolderPasteMarginRatio( m_masterPad->GetLocalSolderPasteMarginRatio() ); - m_currentPad->SetThermalSpokeWidth( m_masterPad->GetThermalSpokeWidth() ); - m_currentPad->SetThermalSpokeAngle( m_masterPad->GetThermalSpokeAngle() ); - m_currentPad->SetThermalGap( m_masterPad->GetThermalGap() ); - m_currentPad->SetRoundRectRadiusRatio( - PADSTACK::ALL_LAYERS, m_masterPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) ); - m_currentPad->SetChamferRectRatio( PADSTACK::ALL_LAYERS, - m_masterPad->GetChamferRectRatio( PADSTACK::ALL_LAYERS ) ); - m_currentPad->SetChamferPositions( PADSTACK::ALL_LAYERS, - m_masterPad->GetChamferPositions( PADSTACK::ALL_LAYERS ) ); - m_currentPad->SetLocalZoneConnection( m_masterPad->GetLocalZoneConnection() ); m_currentPad->GetTeardropParams() = m_masterPad->GetTeardropParams(); - // rounded rect pads with radius ratio = 0 are in fact rect pads. - // So set the right shape (and perhaps issues with a radius = 0) - if( m_currentPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::ROUNDRECT && - m_currentPad->GetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS ) == 0.0 ) - { - m_currentPad->SetShape( PADSTACK::ALL_LAYERS, PAD_SHAPE::RECTANGLE ); - } - // Set the fabrication property: m_currentPad->SetProperty( getSelectedProperty() ); @@ -1593,16 +1717,24 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) if( !m_spokeWidth.Validate( 0, INT_MAX ) ) return false; + switch( m_cbPadstackMode->GetSelection() ) + { + default: + case 0: aPad->Padstack().SetMode( PADSTACK::MODE::NORMAL ); break; + case 1: aPad->Padstack().SetMode( PADSTACK::MODE::FRONT_INNER_BACK ); break; + case 2: aPad->Padstack().SetMode( PADSTACK::MODE::CUSTOM ); break; + } + aPad->SetAttribute( code_type[m_padType->GetSelection()] ); - aPad->SetShape( PADSTACK::ALL_LAYERS, code_shape[m_PadShapeSelector->GetSelection()] ); + aPad->SetShape( m_editLayer, code_shape[m_PadShapeSelector->GetSelection()] ); if( m_PadShapeSelector->GetSelection() == CHOICE_SHAPE_CUSTOM_RECT_ANCHOR ) - aPad->SetAnchorPadShape( PADSTACK::ALL_LAYERS, PAD_SHAPE::RECTANGLE ); + aPad->SetAnchorPadShape( m_editLayer, PAD_SHAPE::RECTANGLE ); else - aPad->SetAnchorPadShape( PADSTACK::ALL_LAYERS, PAD_SHAPE::CIRCLE ); + aPad->SetAnchorPadShape( m_editLayer, PAD_SHAPE::CIRCLE ); - if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::CUSTOM ) - aPad->ReplacePrimitives( PADSTACK::ALL_LAYERS, m_primitives ); + if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::CUSTOM ) + aPad->ReplacePrimitives( m_editLayer, m_primitives ); aPad->GetTeardropParams().m_Enabled = m_cbTeardrops->GetValue(); aPad->GetTeardropParams().m_AllowUseTwoTracks = m_cbTeardropsUseNextTrack->GetValue(); @@ -1677,19 +1809,17 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) aPad->SetDrillSize( VECTOR2I( m_holeX.GetIntValue(), m_holeY.GetIntValue() ) ); } - if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::CIRCLE ) - aPad->SetSize( PADSTACK::ALL_LAYERS, - VECTOR2I( m_sizeX.GetIntValue(), m_sizeX.GetIntValue() ) ); + if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::CIRCLE ) + aPad->SetSize( m_editLayer, VECTOR2I( m_sizeX.GetIntValue(), m_sizeX.GetIntValue() ) ); else - aPad->SetSize( PADSTACK::ALL_LAYERS, - VECTOR2I( m_sizeX.GetIntValue(), m_sizeY.GetIntValue() ) ); + aPad->SetSize( m_editLayer, VECTOR2I( m_sizeX.GetIntValue(), m_sizeY.GetIntValue() ) ); // For a trapezoid, test delta value (be sure delta is not too large for pad size) // remember DeltaSize.x is the Y size variation bool error = false; VECTOR2I delta( 0, 0 ); - if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::TRAPEZOID ) + if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::TRAPEZOID ) { // For a trapezoid, only one of delta.x or delta.y is not 0, depending on axis. if( m_trapAxisCtrl->GetSelection() == 0 ) @@ -1697,38 +1827,37 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) else delta.y = m_trapDelta.GetIntValue(); - if( delta.x < 0 && delta.x < -aPad->GetSize( PADSTACK::ALL_LAYERS ).y ) + if( delta.x < 0 && delta.x < -aPad->GetSize( m_editLayer ).y ) { - delta.x = -aPad->GetSize( PADSTACK::ALL_LAYERS ).y + 2; + delta.x = -aPad->GetSize( m_editLayer ).y + 2; error = true; } - if( delta.x > 0 && delta.x > aPad->GetSize( PADSTACK::ALL_LAYERS ).y ) + if( delta.x > 0 && delta.x > aPad->GetSize( m_editLayer ).y ) { - delta.x = aPad->GetSize( PADSTACK::ALL_LAYERS ).y - 2; + delta.x = aPad->GetSize( m_editLayer ).y - 2; error = true; } - if( delta.y < 0 && delta.y < -aPad->GetSize( PADSTACK::ALL_LAYERS ).x ) + if( delta.y < 0 && delta.y < -aPad->GetSize( m_editLayer ).x ) { - delta.y = -aPad->GetSize( PADSTACK::ALL_LAYERS ).x + 2; + delta.y = -aPad->GetSize( m_editLayer ).x + 2; error = true; } - if( delta.y > 0 && delta.y > aPad->GetSize( PADSTACK::ALL_LAYERS ).x ) + if( delta.y > 0 && delta.y > aPad->GetSize( m_editLayer ).x ) { - delta.y = aPad->GetSize( PADSTACK::ALL_LAYERS ).x - 2; + delta.y = aPad->GetSize( m_editLayer ).x - 2; error = true; } } - aPad->SetDelta( PADSTACK::ALL_LAYERS, delta ); + aPad->SetDelta( m_editLayer, delta ); if( m_offsetShapeOpt->GetValue() ) - aPad->SetOffset( PADSTACK::ALL_LAYERS, - VECTOR2I( m_offsetX.GetIntValue(), m_offsetY.GetIntValue() ) ); + aPad->SetOffset( m_editLayer, VECTOR2I( m_offsetX.GetIntValue(), m_offsetY.GetIntValue() ) ); else - aPad->SetOffset( PADSTACK::ALL_LAYERS, VECTOR2I() ); + aPad->SetOffset( m_editLayer, VECTOR2I() ); // Read pad length die if( m_padToDieOpt->GetValue() ) @@ -1769,17 +1898,17 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) if( m_cbBottomRight1->GetValue() ) chamfers |= RECT_CHAMFER_BOTTOM_RIGHT; } - aPad->SetChamferPositions( PADSTACK::ALL_LAYERS, chamfers ); - if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::CUSTOM ) + aPad->SetChamferPositions( m_editLayer, chamfers ); + + if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::CUSTOM ) { // The pad custom has a "anchor pad" (a basic shape: round or rect pad) // that is the minimal area of this pad, and is useful to ensure a hole // diameter is acceptable, and is used in Gerber files as flashed area // reference - if( aPad->GetAnchorPadShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::CIRCLE ) - aPad->SetSize( PADSTACK::ALL_LAYERS, - VECTOR2I( m_sizeX.GetIntValue(), m_sizeX.GetIntValue() ) ); + if( aPad->GetAnchorPadShape( m_editLayer ) == PAD_SHAPE::CIRCLE ) + aPad->SetSize( m_editLayer, VECTOR2I( m_sizeX.GetIntValue(), m_sizeX.GetIntValue() ) ); } // Define the way the clearance area is defined in zones. Since all non-custom pad @@ -1817,25 +1946,21 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) break; } - if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::ROUNDRECT ) + if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::ROUNDRECT ) { - aPad->SetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS, - m_cornerRatio.GetDoubleValue() / 100.0 ); + aPad->SetRoundRectRadiusRatio( m_editLayer, m_cornerRatio.GetDoubleValue() / 100.0 ); } - else if( aPad->GetShape( PADSTACK::ALL_LAYERS ) == PAD_SHAPE::CHAMFERED_RECT ) + else if( aPad->GetShape( m_editLayer ) == PAD_SHAPE::CHAMFERED_RECT ) { if( m_PadShapeSelector->GetSelection() == CHOICE_SHAPE_CHAMFERED_ROUNDED_RECT ) { - aPad->SetChamferRectRatio( PADSTACK::ALL_LAYERS, - m_mixedChamferRatio.GetDoubleValue() / 100.0 ); - aPad->SetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS, - m_mixedCornerRatio.GetDoubleValue() / 100.0 ); + aPad->SetChamferRectRatio( m_editLayer, m_mixedChamferRatio.GetDoubleValue() / 100.0 ); + aPad->SetRoundRectRadiusRatio( m_editLayer, m_mixedCornerRatio.GetDoubleValue() / 100.0 ); } else // Choice is CHOICE_SHAPE_CHAMFERED_RECT, no rounded corner { - aPad->SetChamferRectRatio( PADSTACK::ALL_LAYERS, - m_chamferRatio.GetDoubleValue() / 100.0 ); - aPad->SetRoundRectRadiusRatio( PADSTACK::ALL_LAYERS, 0 ); + aPad->SetChamferRectRatio( m_editLayer, m_chamferRatio.GetDoubleValue() / 100.0 ); + aPad->SetRoundRectRadiusRatio( m_editLayer, 0 ); } } @@ -1879,8 +2004,8 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) case NPTH_DLG_TYPE: switch( copperLayersChoice ) { - case 0: padLayerMask.set( PADSTACK::ALL_LAYERS ).set( B_Cu ); break; - case 1: padLayerMask.set( PADSTACK::ALL_LAYERS ); break; + case 0: padLayerMask.set( F_Cu ).set( B_Cu ); break; + case 1: padLayerMask.set( F_Cu ); break; case 2: padLayerMask.set( B_Cu ); break; default: break; } @@ -1891,7 +2016,7 @@ bool DIALOG_PAD_PROPERTIES::transferDataToPad( PAD* aPad ) case CONN_DLG_TYPE: switch( copperLayersChoice ) { - case 0: padLayerMask.set( PADSTACK::ALL_LAYERS ); break; + case 0: padLayerMask.set( F_Cu ); break; case 1: padLayerMask.set( B_Cu ); break; } @@ -1945,8 +2070,8 @@ void DIALOG_PAD_PROPERTIES::OnOffsetCheckbox( wxCommandEvent& event ) { if( m_offsetShapeOpt->GetValue() ) { - m_offsetX.SetValue( m_previewPad->GetOffset( PADSTACK::ALL_LAYERS ).x ); - m_offsetY.SetValue( m_previewPad->GetOffset( PADSTACK::ALL_LAYERS ).y ); + m_offsetX.SetValue( m_previewPad->GetOffset( m_editLayer ).x ); + m_offsetY.SetValue( m_previewPad->GetOffset( m_editLayer ).y ); } // Show/hide controls depending on m_offsetShapeOpt being enabled diff --git a/pcbnew/dialogs/dialog_pad_properties.h b/pcbnew/dialogs/dialog_pad_properties.h index 167a570822..c5ba10f22e 100644 --- a/pcbnew/dialogs/dialog_pad_properties.h +++ b/pcbnew/dialogs/dialog_pad_properties.h @@ -55,9 +55,11 @@ public: private: void prepareCanvas(); // Initialize the canvases (legacy or gal) to display the pad void initValues(); + void initPadstackLayerValues(); bool padValuesOK(); ///< test if all values are acceptable for the pad void redraw(); void updateRoundRectCornerValues(); + void afterPadstackModeChanged(); /** * Updates the CheckBox states in pad layers list, based on the layer_mask (if non-empty) @@ -77,6 +79,8 @@ private: void OnUpdateUI( wxUpdateUIEvent& event ) override; void onTeardropsUpdateUi( wxUpdateUIEvent& event ) override; void onTeardropCurvePointsUpdateUi( wxUpdateUIEvent& event ) override; + void OnPadstackModeChanged( wxCommandEvent& event ) override; + void OnEditLayerChanged( wxCommandEvent& event ) override; void OnUpdateUINonCopperWarning( wxUpdateUIEvent& event ) override; @@ -131,6 +135,8 @@ private: bool m_initialized; bool m_canEditNetName; // true only if the caller is the board editor bool m_isFpEditor; // true if the caller is the footprint editor + PCB_LAYER_ID m_editLayer; // Which copper layer of the padstack is being edited + std::map m_editLayerCtrlMap; std::vector> m_primitives; // the custom shape primitives in // local coords, orient 0 diff --git a/pcbnew/dialogs/dialog_pad_properties_base.cpp b/pcbnew/dialogs/dialog_pad_properties_base.cpp index 8988b7290c..9a0ffc7ba9 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.cpp +++ b/pcbnew/dialogs/dialog_pad_properties_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6-dirty) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -87,6 +87,31 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_staticline5 = new wxStaticLine( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_LeftBoxSizer->Add( m_staticline5, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 ); + m_padstackControls = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText891 = new wxStaticText( m_panelGeneral, wxID_ANY, _("Padstack mode:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText891->Wrap( -1 ); + m_padstackControls->Add( m_staticText891, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxString m_cbPadstackModeChoices[] = { _("Normal"), _("Front/Inner/Bottom"), _("Custom") }; + int m_cbPadstackModeNChoices = sizeof( m_cbPadstackModeChoices ) / sizeof( wxString ); + m_cbPadstackMode = new wxChoice( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_cbPadstackModeNChoices, m_cbPadstackModeChoices, 0 ); + m_cbPadstackMode->SetSelection( 1 ); + m_padstackControls->Add( m_cbPadstackMode, 0, wxALL, 5 ); + + m_staticText90 = new wxStaticText( m_panelGeneral, wxID_ANY, _("Edit layer:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText90->Wrap( -1 ); + m_padstackControls->Add( m_staticText90, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxString m_cbEditLayerChoices[] = { _("Inner Layers") }; + int m_cbEditLayerNChoices = sizeof( m_cbEditLayerChoices ) / sizeof( wxString ); + m_cbEditLayer = new wxChoice( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_cbEditLayerNChoices, m_cbEditLayerChoices, 0 ); + m_cbEditLayer->SetSelection( 0 ); + m_padstackControls->Add( m_cbEditLayer, 0, wxALL, 5 ); + + + m_LeftBoxSizer->Add( m_padstackControls, 0, 0, 5 ); + wxGridBagSizer* gbSizerPadOrientation; gbSizerPadOrientation = new wxGridBagSizer( 4, 0 ); gbSizerPadOrientation->SetFlexibleDirection( wxBOTH ); @@ -354,48 +379,6 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_staticline6 = new wxStaticLine( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_LeftBoxSizer->Add( m_staticline6, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 ); - m_gbSizerHole = new wxGridBagSizer( 4, 0 ); - m_gbSizerHole->SetFlexibleDirection( wxBOTH ); - m_gbSizerHole->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_holeShapeLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Hole shape:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_holeShapeLabel->Wrap( -1 ); - m_gbSizerHole->Add( m_holeShapeLabel, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); - - wxString m_holeShapeCtrlChoices[] = { _("Circular"), _("Oval") }; - int m_holeShapeCtrlNChoices = sizeof( m_holeShapeCtrlChoices ) / sizeof( wxString ); - m_holeShapeCtrl = new wxChoice( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_holeShapeCtrlNChoices, m_holeShapeCtrlChoices, 0 ); - m_holeShapeCtrl->SetSelection( 1 ); - m_gbSizerHole->Add( m_holeShapeCtrl, wxGBPosition( 0, 1 ), wxGBSpan( 1, 5 ), wxEXPAND|wxRIGHT, 5 ); - - m_holeXLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Hole size X:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_holeXLabel->Wrap( -1 ); - m_gbSizerHole->Add( m_holeXLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_holeXCtrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_gbSizerHole->Add( m_holeXCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - - m_holeXUnits = new wxStaticText( m_panelGeneral, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); - m_holeXUnits->Wrap( -1 ); - m_gbSizerHole->Add( m_holeXUnits, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_holeYLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_holeYLabel->Wrap( -1 ); - m_gbSizerHole->Add( m_holeYLabel, wxGBPosition( 1, 3 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_holeYCtrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_gbSizerHole->Add( m_holeYCtrl, wxGBPosition( 1, 4 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - - m_holeYUnits = new wxStaticText( m_panelGeneral, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); - m_holeYUnits->Wrap( -1 ); - m_gbSizerHole->Add( m_holeYUnits, wxGBPosition( 1, 5 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - m_LeftBoxSizer->Add( m_gbSizerHole, 0, wxEXPAND, 5 ); - - m_staticline7 = new wxStaticLine( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - m_LeftBoxSizer->Add( m_staticline7, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 ); - wxBoxSizer* bSizer35; bSizer35 = new wxBoxSizer( wxHORIZONTAL ); @@ -443,6 +426,48 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_LeftBoxSizer->Add( m_offsetCtrls, 0, wxEXPAND|wxLEFT|wxRESERVE_SPACE_EVEN_IF_HIDDEN, 25 ); + m_staticline7 = new wxStaticLine( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_LeftBoxSizer->Add( m_staticline7, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 ); + + m_gbSizerHole = new wxGridBagSizer( 4, 0 ); + m_gbSizerHole->SetFlexibleDirection( wxBOTH ); + m_gbSizerHole->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_holeShapeLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Hole shape:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_holeShapeLabel->Wrap( -1 ); + m_gbSizerHole->Add( m_holeShapeLabel, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxString m_holeShapeCtrlChoices[] = { _("Circular"), _("Oval") }; + int m_holeShapeCtrlNChoices = sizeof( m_holeShapeCtrlChoices ) / sizeof( wxString ); + m_holeShapeCtrl = new wxChoice( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_holeShapeCtrlNChoices, m_holeShapeCtrlChoices, 0 ); + m_holeShapeCtrl->SetSelection( 1 ); + m_gbSizerHole->Add( m_holeShapeCtrl, wxGBPosition( 0, 1 ), wxGBSpan( 1, 5 ), wxEXPAND|wxRIGHT, 5 ); + + m_holeXLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Hole size X:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_holeXLabel->Wrap( -1 ); + m_gbSizerHole->Add( m_holeXLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_holeXCtrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_gbSizerHole->Add( m_holeXCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + + m_holeXUnits = new wxStaticText( m_panelGeneral, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); + m_holeXUnits->Wrap( -1 ); + m_gbSizerHole->Add( m_holeXUnits, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_holeYLabel = new wxStaticText( m_panelGeneral, wxID_ANY, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_holeYLabel->Wrap( -1 ); + m_gbSizerHole->Add( m_holeYLabel, wxGBPosition( 1, 3 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_holeYCtrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_gbSizerHole->Add( m_holeYCtrl, wxGBPosition( 1, 4 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + + m_holeYUnits = new wxStaticText( m_panelGeneral, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); + m_holeYUnits->Wrap( -1 ); + m_gbSizerHole->Add( m_holeYUnits, wxGBPosition( 1, 5 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + m_LeftBoxSizer->Add( m_gbSizerHole, 0, wxEXPAND, 5 ); + m_staticline71 = new wxStaticLine( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_LeftBoxSizer->Add( m_staticline71, 0, wxEXPAND|wxTOP|wxBOTTOM, 12 ); @@ -1220,6 +1245,8 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_panelGeneral->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnUpdateUI ), NULL, this ); m_padType->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this ); m_padNumCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_cbPadstackMode->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadstackModeChanged ), NULL, this ); + m_cbEditLayer->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnEditLayerChanged ), NULL, this ); m_PadShapeSelector->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this ); m_trapDeltaCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_trapAxisCtrl->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this ); @@ -1240,12 +1267,12 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_sizeYCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_cb_padrotation->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); m_cb_padrotation->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); - m_holeShapeCtrl->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); - m_holeXCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); - m_holeYCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_offsetShapeOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnOffsetCheckbox ), NULL, this ); m_offsetXCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_offsetYCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_holeShapeCtrl->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); + m_holeXCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_holeYCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_padToDieOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadToDieCheckbox ), NULL, this ); m_rbCopperLayersSel->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetCopperLayers ), NULL, this ); m_layerFrontAdhesive->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this ); @@ -1307,6 +1334,8 @@ DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE() m_panelGeneral->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnUpdateUI ), NULL, this ); m_padType->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadTypeSelected ), NULL, this ); m_padNumCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_cbPadstackMode->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadstackModeChanged ), NULL, this ); + m_cbEditLayer->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnEditLayerChanged ), NULL, this ); m_PadShapeSelector->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadShapeSelection ), NULL, this ); m_trapDeltaCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_trapAxisCtrl->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this ); @@ -1327,12 +1356,12 @@ DIALOG_PAD_PROPERTIES_BASE::~DIALOG_PAD_PROPERTIES_BASE() m_sizeYCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_cb_padrotation->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); m_cb_padrotation->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::PadOrientEvent ), NULL, this ); - m_holeShapeCtrl->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); - m_holeXCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); - m_holeYCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_offsetShapeOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnOffsetCheckbox ), NULL, this ); m_offsetXCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_offsetYCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_holeShapeCtrl->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnDrillShapeSelected ), NULL, this ); + m_holeXCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); + m_holeYCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnValuesChanged ), NULL, this ); m_padToDieOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnPadToDieCheckbox ), NULL, this ); m_rbCopperLayersSel->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetCopperLayers ), NULL, this ); m_layerFrontAdhesive->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES_BASE::OnSetLayers ), NULL, this ); diff --git a/pcbnew/dialogs/dialog_pad_properties_base.fbp b/pcbnew/dialogs/dialog_pad_properties_base.fbp index 9d93dc16e2..eab1aa1511 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.fbp +++ b/pcbnew/dialogs/dialog_pad_properties_base.fbp @@ -1,34 +1,36 @@ - + - C++ - 1 - source_name - 0 - 0 + + 1 + connect + none + + + 0 + 1 res UTF-8 - connect dialog_pad_properties_base 1000 - none - - 1 + 1 + UI dialog_pad_properties_base - . - + 0 + source_name + 1 + 0 + source_name + + + 1 1 - 1 - 1 - 1 - UI - 0 - 1 0 + 0 0 wxAUI_MGR_DEFAULT @@ -81,10 +83,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -139,10 +141,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -228,10 +230,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -293,10 +295,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -362,10 +364,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -427,10 +429,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -496,10 +498,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -561,10 +563,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -627,10 +629,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -692,10 +694,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -760,10 +762,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -825,10 +827,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -890,10 +892,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -958,10 +960,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1022,10 +1024,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1072,11 +1074,278 @@ - + + 5 + + 0 + + + m_padstackControls + wxHORIZONTAL + protected + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + 0 + + 0 + 0 + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + 1 + + 1 + + 0 + 0 + wxID_ANY + Padstack mode: + 0 + + 0 + + + 0 + + 1 + m_staticText891 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + 0 + + 0 + 0 + + + + 1 + 0 + "Normal" "Front/Inner/Bottom" "Custom" + 1 + + 1 + 0 + Dock + 0 + Left + 0 + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_cbPadstackMode + 1 + + + protected + 1 + + Resizable + 1 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnPadstackModeChanged + + + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + 0 + + 0 + 0 + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + 1 + + 1 + + 0 + 0 + wxID_ANY + Edit layer: + 0 + + 0 + + + 0 + + 1 + m_staticText90 + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + 0 + + 0 + 0 + + + + 1 + 0 + "Inner Layers" + 1 + + 1 + 0 + Dock + 0 + Left + 0 + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_cbEditLayer + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnEditLayerChanged + + + + + 5 wxEXPAND 0 - + wxBOTH 0 @@ -1099,10 +1368,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1164,10 +1433,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1233,10 +1502,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1288,10 +1557,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1345,10 +1614,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1413,10 +1682,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1475,10 +1744,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1541,10 +1810,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1603,10 +1872,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1665,10 +1934,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1733,10 +2002,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1801,10 +2070,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1863,10 +2132,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1929,10 +2198,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -1991,10 +2260,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2053,10 +2322,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2080,7 +2349,7 @@ 0 - + 0 0 @@ -2119,10 +2388,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2183,10 +2452,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2251,10 +2520,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2322,10 +2591,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2388,10 +2657,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2452,10 +2721,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2526,10 +2795,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2592,10 +2861,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2658,10 +2927,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2724,10 +2993,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2794,10 +3063,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2862,10 +3131,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2933,10 +3202,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -2999,10 +3268,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3063,10 +3332,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3137,10 +3406,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3203,10 +3472,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3269,10 +3538,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3335,10 +3604,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3403,10 +3672,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3474,10 +3743,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3540,10 +3809,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3612,10 +3881,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3677,10 +3946,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3746,10 +4015,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3811,10 +4080,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3876,10 +4145,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -3945,10 +4214,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4010,10 +4279,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4075,10 +4344,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4146,10 +4415,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4210,10 +4479,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4264,38 +4533,30 @@ 5 wxEXPAND 0 - - - wxBOTH - - - 0 + - m_gbSizerHole - wxFLEX_GROWMODE_SPECIFIED - protected - 4 - + bSizer35 + wxHORIZONTAL + none + 5 - 1 - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT - 0 - 1 - + wxLEFT + 0 + 1 1 1 1 - + 0 - - + 0 + 0 1 0 + 0 1 1 @@ -4311,8 +4572,7 @@ 0 0 wxID_ANY - Hole shape: - 0 + Offset shape from hole 0 @@ -4320,7 +4580,7 @@ 0 1 - m_holeShapeLabel + m_offsetShapeOpt 1 @@ -4331,37 +4591,37 @@ 1 - + ; ; forward_declare 0 + + wxFILTER_NONE + wxDefaultValidator + - -1 + OnOffsetCheckbox - + 5 - 5 - 1 - wxEXPAND|wxRIGHT - 0 - 1 - + wxRIGHT + 0 + 1 1 1 1 - + 0 - - + 0 + 0 1 0 - "Circular" "Oval" 1 1 @@ -4377,6 +4637,8 @@ 0 0 wxID_ANY + : + 0 0 @@ -4384,7 +4646,7 @@ 0 1 - m_holeShapeCtrl + m_offsetShapeOptLabel 1 @@ -4392,39 +4654,59 @@ 1 Resizable - 1 1 - + ; ; forward_declare 0 - - wxFILTER_NONE - wxDefaultValidator - - OnDrillShapeSelected + -1 - + + + + 5 + wxEXPAND + 0 + + 2 + protected + 0 + + + + 25 + wxEXPAND|wxLEFT|wxRESERVE_SPACE_EVEN_IF_HIDDEN + 0 + + 6 + wxBOTH + 1,4 + + 0 + + m_offsetCtrls + wxFLEX_GROWMODE_SPECIFIED + protected + 0 + 0 + 5 - 1 - 0 - wxALIGN_CENTER_VERTICAL|wxLEFT - 1 - 1 + wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4445,7 +4727,7 @@ 0 0 wxID_ANY - Hole size X: + X: 0 0 @@ -4454,7 +4736,7 @@ 0 1 - m_holeXLabel + m_offsetXLabel 1 @@ -4474,22 +4756,19 @@ -1 - + 5 - 1 - 1 - wxALIGN_CENTER_VERTICAL - 1 - 1 + wxEXPAND|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxALIGN_CENTER_VERTICAL + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4518,7 +4797,7 @@ 0 1 - m_holeXCtrl + m_offsetXCtrl 1 @@ -4543,22 +4822,19 @@ OnValuesChanged - + 5 - 1 - 2 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 1 - 1 + wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4588,7 +4864,7 @@ 0 1 - m_holeXUnits + m_offsetXUnits 1 @@ -4608,22 +4884,19 @@ -1 - + 5 - 1 - 3 wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 1 - 1 + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4653,7 +4926,7 @@ 0 1 - m_holeYLabel + m_offsetYLabel 1 @@ -4673,22 +4946,19 @@ -1 - + 5 - 1 - 4 - wxALIGN_CENTER_VERTICAL - 1 - 1 + wxEXPAND|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxALIGN_CENTER_VERTICAL + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4717,7 +4987,7 @@ 0 1 - m_holeYCtrl + m_offsetYCtrl 1 @@ -4742,22 +5012,19 @@ OnValuesChanged - + 5 - 1 - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 1 - 1 + wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT + 0 1 1 1 1 - + 0 - - + 0 + 0 @@ -4787,7 +5054,7 @@ 0 1 - m_holeYUnits + m_offsetYUnits 1 @@ -4818,10 +5085,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -4868,34 +5135,42 @@ - + 5 wxEXPAND 0 - + + + wxBOTH + + + 0 - bSizer35 - wxHORIZONTAL - none - + m_gbSizerHole + wxFLEX_GROWMODE_SPECIFIED + protected + 4 + 5 - wxLEFT - 0 - + 1 + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + 1 + 1 1 1 1 - + 0 - - + 0 + 0 1 0 - 0 1 1 @@ -4911,7 +5186,8 @@ 0 0 wxID_ANY - Offset shape from hole + Hole shape: + 0 0 @@ -4919,7 +5195,7 @@ 0 1 - m_offsetShapeOpt + m_holeShapeLabel 1 @@ -4930,37 +5206,37 @@ 1 - ; ; forward_declare + 0 - - wxFILTER_NONE - wxDefaultValidator - - OnOffsetCheckbox + -1 - + 5 - wxRIGHT - 0 - + 5 + 1 + wxEXPAND|wxRIGHT + 0 + 1 + 1 1 1 1 - + 0 - - + 0 + 0 1 0 + "Circular" "Oval" 1 1 @@ -4976,8 +5252,6 @@ 0 0 wxID_ANY - : - 0 0 @@ -4985,7 +5259,7 @@ 0 1 - m_offsetShapeOptLabel + m_holeShapeCtrl 1 @@ -4993,59 +5267,39 @@ 1 Resizable + 1 1 - ; ; forward_declare + 0 + + wxFILTER_NONE + wxDefaultValidator + - -1 + OnDrillShapeSelected - - - - 5 - wxEXPAND - 0 - - 2 - protected - 0 - - - - 25 - wxEXPAND|wxLEFT|wxRESERVE_SPACE_EVEN_IF_HIDDEN - 0 - - 6 - wxBOTH - 1,4 - - 0 - - m_offsetCtrls - wxFLEX_GROWMODE_SPECIFIED - protected - 0 - 0 - + 5 - wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT - 0 + 1 + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5066,7 +5320,7 @@ 0 0 wxID_ANY - X: + Hole size X: 0 0 @@ -5075,7 +5329,7 @@ 0 1 - m_offsetXLabel + m_holeXLabel 1 @@ -5095,19 +5349,22 @@ -1 - + 5 - wxEXPAND|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxALIGN_CENTER_VERTICAL - 0 + 1 + 1 + wxALIGN_CENTER_VERTICAL + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5136,7 +5393,7 @@ 0 1 - m_offsetXCtrl + m_holeXCtrl 1 @@ -5161,19 +5418,22 @@ OnValuesChanged - + 5 - wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT - 0 + 1 + 2 + wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5203,7 +5463,7 @@ 0 1 - m_offsetXUnits + m_holeXUnits 1 @@ -5223,19 +5483,22 @@ -1 - + 5 + 1 + 3 wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 0 + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5265,7 +5528,7 @@ 0 1 - m_offsetYLabel + m_holeYLabel 1 @@ -5285,19 +5548,22 @@ -1 - + 5 - wxEXPAND|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxALIGN_CENTER_VERTICAL - 0 + 1 + 4 + wxALIGN_CENTER_VERTICAL + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5326,7 +5592,7 @@ 0 1 - m_offsetYCtrl + m_holeYCtrl 1 @@ -5351,19 +5617,22 @@ OnValuesChanged - + 5 - wxALIGN_CENTER_VERTICAL|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxRIGHT|wxLEFT - 0 + 1 + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + 1 + 1 1 1 1 1 - + 0 - - + 0 + 0 @@ -5393,7 +5662,7 @@ 0 1 - m_offsetYUnits + m_holeYUnits 1 @@ -5424,10 +5693,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5508,10 +5777,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5574,10 +5843,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5638,10 +5907,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5703,10 +5972,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5799,10 +6068,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5858,10 +6127,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5922,10 +6191,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -5984,10 +6253,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6050,10 +6319,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6112,10 +6381,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6178,10 +6447,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6244,10 +6513,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6310,10 +6579,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6376,10 +6645,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6442,10 +6711,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6508,10 +6777,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6574,10 +6843,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6640,10 +6909,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6706,10 +6975,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6772,10 +7041,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6840,10 +7109,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6912,10 +7181,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -6982,10 +7251,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7073,10 +7342,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7141,10 +7410,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7203,10 +7472,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7287,10 +7556,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7354,10 +7623,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7421,10 +7690,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7518,10 +7787,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7581,10 +7850,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7649,10 +7918,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7712,10 +7981,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7774,10 +8043,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7852,10 +8121,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7915,10 +8184,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -7992,10 +8261,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8089,10 +8358,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8152,10 +8421,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8229,10 +8498,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8291,10 +8560,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8353,10 +8622,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8417,10 +8686,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8480,10 +8749,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8507,7 +8776,7 @@ 0 - + 0 0 @@ -8546,10 +8815,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8639,10 +8908,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8702,10 +8971,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8777,10 +9046,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8839,10 +9108,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8901,10 +9170,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -8965,10 +9234,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9028,10 +9297,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9055,7 +9324,7 @@ 0 - + 0 0 @@ -9094,10 +9363,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9168,10 +9437,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9243,10 +9512,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9306,10 +9575,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9415,10 +9684,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9477,10 +9746,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9543,10 +9812,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9605,10 +9874,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9703,10 +9972,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9765,10 +10034,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9831,10 +10100,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9893,10 +10162,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -9955,10 +10224,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10021,10 +10290,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10083,10 +10352,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10145,10 +10414,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10172,7 +10441,7 @@ 0 - + 0 0 @@ -10211,10 +10480,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10284,10 +10553,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10366,10 +10635,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10428,10 +10697,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10490,10 +10759,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10568,10 +10837,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10630,10 +10899,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10696,10 +10965,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10758,10 +11027,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10820,10 +11089,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10886,10 +11155,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -10948,10 +11217,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11010,10 +11279,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11076,10 +11345,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11138,10 +11407,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11200,10 +11469,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11266,10 +11535,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11330,10 +11599,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11386,10 +11655,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11447,10 +11716,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11509,10 +11778,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11573,10 +11842,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11634,10 +11903,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11693,10 +11962,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11788,10 +12057,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11843,10 +12112,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11904,10 +12173,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -11965,10 +12234,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12026,10 +12295,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12087,10 +12356,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12148,10 +12417,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12209,10 +12478,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12272,10 +12541,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12333,10 +12602,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12394,10 +12663,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12455,10 +12724,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12516,10 +12785,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12577,10 +12846,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12638,10 +12907,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12699,10 +12968,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12773,10 +13042,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12850,10 +13119,10 @@ 1 1 1 - + 0 - - + 0 + 0 @@ -12922,10 +13191,10 @@ 1 1 1 - + 0 - - + 0 + 0 diff --git a/pcbnew/dialogs/dialog_pad_properties_base.h b/pcbnew/dialogs/dialog_pad_properties_base.h index 3e0bc0eb91..c63e69f084 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.h +++ b/pcbnew/dialogs/dialog_pad_properties_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6-dirty) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -24,8 +24,8 @@ class TEXT_CTRL_EVAL; #include #include #include -#include #include +#include #include #include #include @@ -52,7 +52,7 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM enum { wxID_DIALOG_EDIT_PAD = 1000, - wxID_PADNUMCTRL + wxID_PADNUMCTRL, }; wxBoxSizer* m_MainSizer; @@ -72,6 +72,11 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM wxTextCtrl* m_posYCtrl; wxStaticText* m_posYUnits; wxStaticLine* m_staticline5; + wxBoxSizer* m_padstackControls; + wxStaticText* m_staticText891; + wxChoice* m_cbPadstackMode; + wxStaticText* m_staticText90; + wxChoice* m_cbEditLayer; wxStaticText* m_shapeLabel; wxChoice* m_PadShapeSelector; wxSimplebook* m_shapePropsBook; @@ -122,16 +127,6 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM wxComboBox* m_cb_padrotation; wxStaticText* m_orientationUnits; wxStaticLine* m_staticline6; - wxGridBagSizer* m_gbSizerHole; - wxStaticText* m_holeShapeLabel; - wxChoice* m_holeShapeCtrl; - wxStaticText* m_holeXLabel; - wxTextCtrl* m_holeXCtrl; - wxStaticText* m_holeXUnits; - wxStaticText* m_holeYLabel; - wxTextCtrl* m_holeYCtrl; - wxStaticText* m_holeYUnits; - wxStaticLine* m_staticline7; wxCheckBox* m_offsetShapeOpt; wxStaticText* m_offsetShapeOptLabel; wxFlexGridSizer* m_offsetCtrls; @@ -141,6 +136,16 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM wxStaticText* m_offsetYLabel; wxTextCtrl* m_offsetYCtrl; wxStaticText* m_offsetYUnits; + wxStaticLine* m_staticline7; + wxGridBagSizer* m_gbSizerHole; + wxStaticText* m_holeShapeLabel; + wxChoice* m_holeShapeCtrl; + wxStaticText* m_holeXLabel; + wxTextCtrl* m_holeXCtrl; + wxStaticText* m_holeXUnits; + wxStaticText* m_holeYLabel; + wxTextCtrl* m_holeYCtrl; + wxStaticText* m_holeYUnits; wxStaticLine* m_staticline71; wxCheckBox* m_padToDieOpt; wxStaticText* m_padToDieLabel; @@ -264,13 +269,15 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM virtual void OnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void PadTypeSelected( wxCommandEvent& event ) { event.Skip(); } virtual void OnValuesChanged( wxCommandEvent& event ) { event.Skip(); } + virtual void OnPadstackModeChanged( wxCommandEvent& event ) { event.Skip(); } + virtual void OnEditLayerChanged( wxCommandEvent& event ) { event.Skip(); } virtual void OnPadShapeSelection( wxCommandEvent& event ) { event.Skip(); } virtual void OnSetLayers( wxCommandEvent& event ) { event.Skip(); } virtual void onCornerSizePercentChange( wxCommandEvent& event ) { event.Skip(); } virtual void onCornerRadiusChange( wxCommandEvent& event ) { event.Skip(); } virtual void PadOrientEvent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDrillShapeSelected( wxCommandEvent& event ) { event.Skip(); } virtual void OnOffsetCheckbox( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDrillShapeSelected( wxCommandEvent& event ) { event.Skip(); } virtual void OnPadToDieCheckbox( wxCommandEvent& event ) { event.Skip(); } virtual void OnSetCopperLayers( wxCommandEvent& event ) { event.Skip(); } virtual void onModify( wxCommandEvent& event ) { event.Skip(); } diff --git a/pcbnew/padstack.cpp b/pcbnew/padstack.cpp index 3778c6496d..c5c409ac0e 100644 --- a/pcbnew/padstack.cpp +++ b/pcbnew/padstack.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -71,6 +72,26 @@ PADSTACK& PADSTACK::operator=( const PADSTACK &aOther ) m_customShapeInZoneMode = aOther.m_customShapeInZoneMode; m_drill = aOther.m_drill; m_secondaryDrill = aOther.m_secondaryDrill; + + // Data consistency enforcement logic that used to live in the pad properties dialog + // TODO(JE) Should these move to individual property setters, so that they are always + // enforced even through the properties panel and API? + + ForEachUniqueLayer( + [this]( PCB_LAYER_ID aLayer ) + { + PAD_SHAPE shape = Shape( aLayer ); + + // Make sure leftover primitives don't stick around + if( shape != PAD_SHAPE::CUSTOM ) + ClearPrimitives( aLayer ); + + // rounded rect pads with radius ratio = 0 are in fact rect pads. + // So set the right shape (and perhaps issues with a radius = 0) + if( shape == PAD_SHAPE::ROUNDRECT && RoundRectRadiusRatio( aLayer ) == 0.0 ) + SetShape( PAD_SHAPE::RECTANGLE, aLayer ); + } ); + return *this; } @@ -704,6 +725,9 @@ bool PADSTACK::DRILL_PROPS::operator==( const DRILL_PROPS& aOther ) const void PADSTACK::SetMode( MODE aMode ) { + if( m_mode == aMode ) + return; + m_mode = aMode; switch( m_mode ) @@ -728,6 +752,11 @@ void PADSTACK::SetMode( MODE aMode ) break; } + + // Changing mode invalidates cached shapes + // TODO(JE) clean this up -- maybe PADSTACK should own shape caches + if( PAD* parentPad = dynamic_cast( m_parent ) ) + parentPad->SetDirty(); }