Implemented per layer properties in dialog_copper_zones

This commit is contained in:
Daniel Treffenstädt 2025-07-12 16:24:05 +02:00
parent a4c8da229e
commit 1082ba3c8a
No known key found for this signature in database
GPG Key ID: 3D92CAF477537F3E

View File

@ -23,6 +23,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "layer_ids.h"
#include <wx/radiobut.h> #include <wx/radiobut.h>
#include <kiface_base.h> #include <kiface_base.h>
#include <confirm.h> #include <confirm.h>
@ -36,6 +37,7 @@
#include <trigo.h> #include <trigo.h>
#include <eda_pattern_match.h> #include <eda_pattern_match.h>
#include <pcb_layer_box_selector.h>
#include <dialog_copper_zones_base.h> #include <dialog_copper_zones_base.h>
#include <string_utils.h> #include <string_utils.h>
@ -76,6 +78,8 @@ private:
void OnNetSelectionUpdated( wxCommandEvent& event ) override; void OnNetSelectionUpdated( wxCommandEvent& event ) override;
void OnRemoveIslandsSelection( wxCommandEvent& event ) override; void OnRemoveIslandsSelection( wxCommandEvent& event ) override;
void OnPadInZoneSelection( wxCommandEvent& event ) override; void OnPadInZoneSelection( wxCommandEvent& event ) override;
void OnLayerSelectorChanged( wxCommandEvent& event ) override;
void OnHatchingOffsetChecked( wxCommandEvent& event ) override;
void readNetInformation(); void readNetInformation();
void readFilteringAndSortingCriteria(); void readFilteringAndSortingCriteria();
@ -91,6 +95,7 @@ private:
void updateInfoBar(); void updateInfoBar();
void storePersistentNetSortConfigurations(); void storePersistentNetSortConfigurations();
void loadPersistentNetSortConfigurations(); void loadPersistentNetSortConfigurations();
void updatePerLayerProperties();
private: private:
PCB_BASE_FRAME* m_Parent; PCB_BASE_FRAME* m_Parent;
@ -130,6 +135,11 @@ private:
wxRadioButton* m_rbCenterline; wxRadioButton* m_rbCenterline;
wxRadioButton* m_rbEnvelope; wxRadioButton* m_rbEnvelope;
wxCheckBox* m_cbDeleteOriginals; wxCheckBox* m_cbDeleteOriginals;
UNIT_BINDER m_hatchingOffsetX;
UNIT_BINDER m_hatchingOffsetY;
PCB_LAYER_ID m_currentLayer;
}; };
@ -191,7 +201,10 @@ DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE( PCB_BASE_FRAME* aParent, ZONE_SETTINGS*
m_convertSettings( aConvertSettings ), m_convertSettings( aConvertSettings ),
m_rbCenterline( nullptr ), m_rbCenterline( nullptr ),
m_rbEnvelope( nullptr ), m_rbEnvelope( nullptr ),
m_cbDeleteOriginals( nullptr ) m_cbDeleteOriginals( nullptr ),
m_hatchingOffsetX( aParent, m_hatchingOffsetXLabel, m_hatchingOffsetXValue, m_hatchingOffsetXUnit ),
m_hatchingOffsetY( aParent, m_hatchingOffsetYLabel, m_hatchingOffsetYValue, m_hatchingOffsetYUnit ),
m_currentLayer( UNDEFINED_LAYER )
{ {
m_Parent = aParent; m_Parent = aParent;
@ -264,6 +277,8 @@ DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE( PCB_BASE_FRAME* aParent, ZONE_SETTINGS*
m_gap = nullptr; m_gap = nullptr;
} }
m_currentLayer = m_settings.m_Layers.Seq().at( 0 );
m_currentlySelectedNetcode = INVALID_NET_CODE; m_currentlySelectedNetcode = INVALID_NET_CODE;
m_maxNetCode = INVALID_NET_CODE; m_maxNetCode = INVALID_NET_CODE;
@ -377,6 +392,32 @@ bool DIALOG_COPPER_ZONE::TransferDataToWindow()
m_tcZoneName->SetValue( m_settings.m_Name ); m_tcZoneName->SetValue( m_settings.m_Name );
m_layerSelector->SetLayersHotkeys( false );
m_layerSelector->SetBoardFrame( m_Parent );
m_layerSelector->SetNotAllowedLayerSet( ~( m_settings.m_Layers ) );
m_layerSelector->Resync();
if( !m_settings.m_LayerProperties.empty() )
{
m_currentLayer = m_settings.m_LayerProperties.begin()->first;
m_hatchingOffsetUseDefault->SetValue(
!m_settings.m_LayerProperties[m_currentLayer].hatching_offset.has_value() );
VECTOR2I value = m_settings.m_LayerProperties[m_currentLayer].hatching_offset.value_or( VECTOR2I( 0, 0 ) );
m_hatchingOffsetX.SetValue( value.x );
m_hatchingOffsetY.SetValue( value.y );
m_hatchingOffsetXValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
m_hatchingOffsetYValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
}
else
{
m_currentLayer = m_settings.m_Layers.Seq().at( 0 );
}
m_layerSelector->SetLayerSelection( m_currentLayer );
SetInitialFocus( m_ShowNetNameFilter ); SetInitialFocus( m_ShowNetNameFilter );
// Enable/Disable some widgets // Enable/Disable some widgets
@ -485,6 +526,35 @@ void DIALOG_COPPER_ZONE::OnPadInZoneSelection( wxCommandEvent& event )
} }
void DIALOG_COPPER_ZONE::OnLayerSelectorChanged( wxCommandEvent& aEvent )
{
if( m_currentLayer != UNDEFINED_LAYER )
{
if( !m_hatchingOffsetUseDefault->IsChecked() )
{
m_settings.m_LayerProperties[m_currentLayer].hatching_offset =
VECTOR2I( m_hatchingOffsetX.GetIntValue(), m_hatchingOffsetY.GetIntValue() );
}
else
{
m_settings.m_LayerProperties[m_currentLayer].hatching_offset.reset();
}
}
updatePerLayerProperties();
aEvent.Skip();
}
void DIALOG_COPPER_ZONE::OnHatchingOffsetChecked( wxCommandEvent& aEvent )
{
m_hatchingOffsetXValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
m_hatchingOffsetYValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
aEvent.Skip();
}
bool DIALOG_COPPER_ZONE::TransferDataFromWindow() bool DIALOG_COPPER_ZONE::TransferDataFromWindow()
{ {
if( m_GridStyleCtrl->GetSelection() > 0 ) if( m_GridStyleCtrl->GetSelection() > 0 )
@ -512,6 +582,23 @@ bool DIALOG_COPPER_ZONE::TransferDataFromWindow()
m_settings.m_HatchSmoothingLevel = m_spinCtrlSmoothLevel->GetValue(); m_settings.m_HatchSmoothingLevel = m_spinCtrlSmoothLevel->GetValue();
m_settings.m_HatchSmoothingValue = m_spinCtrlSmoothValue->GetValue(); m_settings.m_HatchSmoothingValue = m_spinCtrlSmoothValue->GetValue();
if( m_currentLayer != UNDEFINED_LAYER )
{
if( !m_settings.m_LayerProperties.contains( m_currentLayer ) )
m_settings.m_LayerProperties.emplace( m_currentLayer, ZONE_LAYER_PROPERTIES() );
if( !m_hatchingOffsetUseDefault->IsChecked() )
{
m_settings.m_LayerProperties[m_currentLayer].hatching_offset =
VECTOR2I( m_hatchingOffsetX.GetIntValue(), m_hatchingOffsetY.GetIntValue() );
}
else
{
m_settings.m_LayerProperties[m_currentLayer].hatching_offset.reset();
}
}
*m_ptr = m_settings; *m_ptr = m_settings;
return true; return true;
} }
@ -656,6 +743,15 @@ void DIALOG_COPPER_ZONE::OnLayerSelection( wxDataViewEvent& event )
m_layers->GetValue( layerID, row, 2 ); m_layers->GetValue( layerID, row, 2 );
m_settings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), checked ); m_settings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), checked );
m_layerSelector->SetNotAllowedLayerSet( ~( m_settings.m_Layers ) );
m_layerSelector->Resync();
m_currentLayer = m_settings.m_Layers.Seq().at( 0 );
m_layerSelector->SetLayerSelection( m_currentLayer );
updatePerLayerProperties();
} }
@ -697,6 +793,28 @@ void DIALOG_COPPER_ZONE::loadPersistentNetSortConfigurations()
} }
void DIALOG_COPPER_ZONE::updatePerLayerProperties()
{
m_currentLayer = ToLAYER_ID( m_layerSelector->GetLayerSelection() );
if( m_currentLayer != UNDEFINED_LAYER )
{
if( !m_settings.m_LayerProperties.contains( m_currentLayer ) )
m_settings.m_LayerProperties.emplace( m_currentLayer, ZONE_LAYER_PROPERTIES() );
m_hatchingOffsetUseDefault->SetValue(
!m_settings.m_LayerProperties[m_currentLayer].hatching_offset.has_value() );
VECTOR2I value = m_settings.m_LayerProperties[m_currentLayer].hatching_offset.value_or( VECTOR2I( 0, 0 ) );
m_hatchingOffsetX.SetValue( value.x );
m_hatchingOffsetY.SetValue( value.y );
m_hatchingOffsetXValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
m_hatchingOffsetYValue->Enable( !m_hatchingOffsetUseDefault->IsChecked() );
}
}
void DIALOG_COPPER_ZONE::OnShowNetNameFilterChange( wxCommandEvent& event ) void DIALOG_COPPER_ZONE::OnShowNetNameFilterChange( wxCommandEvent& event )
{ {
updateDisplayedListOfNets(); updateDisplayedListOfNets();