7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-11 14:50:11 +00:00
This commit is contained in:
Jeff Young 2025-02-25 17:07:59 +00:00
parent 92cdca69b3
commit 931b1b0231
2 changed files with 58 additions and 51 deletions

View File

@ -37,7 +37,7 @@
#include <board_commit.h>
DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent,
DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent,
const PCB_SELECTION& aItems ) :
DIALOG_TRACK_VIA_PROPERTIES_BASE( aParent ),
m_frame( aParent ),
@ -537,7 +537,7 @@ void DIALOG_TRACK_VIA_PROPERTIES::onUnitsChanged( wxCommandEvent& aEvent )
}
bool DIALOG_TRACK_VIA_PROPERTIES::confirmPadChange( const std::vector<PAD*>& changingPads )
bool DIALOG_TRACK_VIA_PROPERTIES::confirmPadChange( const std::set<PAD*>& changingPads )
{
wxString msg;
@ -577,6 +577,14 @@ bool DIALOG_TRACK_VIA_PROPERTIES::confirmPadChange( const std::vector<PAD*>& cha
bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
{
std::vector<PCB_TRACK*> tracks;
for( EDA_ITEM* item : m_items )
{
if( PCB_TRACK* track = dynamic_cast<PCB_TRACK*>( item ) )
tracks.push_back( track );
}
// Check for malformed data ONLY; design rules and constraints are the business of DRC.
if( m_vias )
@ -628,51 +636,50 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
bool changeLock = m_lockedCbox->Get3StateValue() != wxCHK_UNDETERMINED;
bool setLock = m_lockedCbox->Get3StateValue() == wxCHK_CHECKED;
for( EDA_ITEM* item : m_items )
for( PCB_TRACK* track : tracks )
{
commit.Modify( item );
commit.Modify( track );
switch( item->Type() )
switch( track->Type() )
{
case PCB_TRACE_T:
case PCB_ARC_T:
{
wxASSERT( m_tracks );
PCB_TRACK* t = static_cast<PCB_TRACK*>( item );
if( !m_trackStartX.IsIndeterminate() )
t->SetStartX( m_trackStartX.GetIntValue() );
track->SetStartX( m_trackStartX.GetIntValue() );
if( !m_trackStartY.IsIndeterminate() )
t->SetStartY( m_trackStartY.GetIntValue() );
track->SetStartY( m_trackStartY.GetIntValue() );
if( !m_trackEndX.IsIndeterminate() )
t->SetEndX( m_trackEndX.GetIntValue() );
track->SetEndX( m_trackEndX.GetIntValue() );
if( !m_trackEndY.IsIndeterminate() )
t->SetEndY( m_trackEndY.GetIntValue() );
track->SetEndY( m_trackEndY.GetIntValue() );
if( !m_trackWidth.IsIndeterminate() )
t->SetWidth( m_trackWidth.GetIntValue() );
track->SetWidth( m_trackWidth.GetIntValue() );
int layer = m_TrackLayerCtrl->GetLayerSelection();
if( layer != UNDEFINED_LAYER )
t->SetLayer( (PCB_LAYER_ID) layer );
track->SetLayer( (PCB_LAYER_ID) layer );
if ( m_trackHasSolderMask->Get3StateValue() != wxCHK_UNDETERMINED )
t->SetHasSolderMask( m_trackHasSolderMask->GetValue() );
track->SetHasSolderMask( m_trackHasSolderMask->GetValue() );
if( !m_trackMaskMargin.IsIndeterminate() )
{
if( m_trackMaskMargin.IsNull() )
t->SetLocalSolderMaskMargin( {} );
track->SetLocalSolderMaskMargin( {} );
else
t->SetLocalSolderMaskMargin( m_trackMaskMargin.GetIntValue() );
track->SetLocalSolderMaskMargin( m_trackMaskMargin.GetIntValue() );
}
if( changeLock )
t->SetLocked( setLock );
track->SetLocked( setLock );
break;
}
@ -680,30 +687,30 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
case PCB_VIA_T:
{
wxASSERT( m_vias );
PCB_VIA* v = static_cast<PCB_VIA*>( item );
PCB_VIA* via = static_cast<PCB_VIA*>( track );
if( !m_viaX.IsIndeterminate() )
v->SetPosition( VECTOR2I( m_viaX.GetIntValue(), v->GetPosition().y ) );
via->SetPosition( VECTOR2I( m_viaX.GetIntValue(), via->GetPosition().y ) );
if( !m_viaY.IsIndeterminate() )
v->SetPosition( VECTOR2I( v->GetPosition().x, m_viaY.GetIntValue() ) );
via->SetPosition( VECTOR2I( via->GetPosition().x, m_viaY.GetIntValue() ) );
if( m_viaNotFree->Get3StateValue() != wxCHK_UNDETERMINED )
v->SetIsFree( !m_viaNotFree->GetValue() );
via->SetIsFree( !m_viaNotFree->GetValue() );
if( !m_viaDiameter.IsIndeterminate() )
v->SetPadstack( *m_viaStack );
via->SetPadstack( *m_viaStack );
switch( m_ViaTypeChoice->GetSelection() )
{
case 0:
v->SetViaType( VIATYPE::THROUGH );
via->SetViaType( VIATYPE::THROUGH );
break;
case 1:
v->SetViaType( VIATYPE::MICROVIA );
via->SetViaType( VIATYPE::MICROVIA );
break;
case 2:
v->SetViaType( VIATYPE::BLIND_BURIED );
via->SetViaType( VIATYPE::BLIND_BURIED );
break;
default:
break;
@ -715,29 +722,29 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
if( startLayer != UNDEFINED_LAYER )
{
m_viaStack->Drill().start = startLayer;
v->SetTopLayer( startLayer );
via->SetTopLayer( startLayer );
}
if( endLayer != UNDEFINED_LAYER )
{
m_viaStack->Drill().end = endLayer;
v->SetBottomLayer( endLayer );
via->SetBottomLayer( endLayer );
}
v->SanitizeLayers();
via->SanitizeLayers();
switch( m_annularRingsCtrl->GetSelection() )
{
case 0:
v->Padstack().SetUnconnectedLayerMode(
via->Padstack().SetUnconnectedLayerMode(
PADSTACK::UNCONNECTED_LAYER_MODE::KEEP_ALL );
break;
case 1:
v->Padstack().SetUnconnectedLayerMode(
via->Padstack().SetUnconnectedLayerMode(
PADSTACK::UNCONNECTED_LAYER_MODE::REMOVE_EXCEPT_START_AND_END );
break;
case 2:
v->Padstack().SetUnconnectedLayerMode(
via->Padstack().SetUnconnectedLayerMode(
PADSTACK::UNCONNECTED_LAYER_MODE::REMOVE_ALL );
break;
default:
@ -747,23 +754,23 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
switch( m_tentingFrontCtrl->GetSelection() )
{
default:
case 0: v->Padstack().FrontOuterLayers().has_solder_mask.reset(); break;
case 1: v->Padstack().FrontOuterLayers().has_solder_mask = true; break;
case 2: v->Padstack().FrontOuterLayers().has_solder_mask = false; break;
case 0: via->Padstack().FrontOuterLayers().has_solder_mask.reset(); break;
case 1: via->Padstack().FrontOuterLayers().has_solder_mask = true; break;
case 2: via->Padstack().FrontOuterLayers().has_solder_mask = false; break;
}
switch( m_tentingBackCtrl->GetSelection() )
{
default:
case 0: v->Padstack().BackOuterLayers().has_solder_mask.reset(); break;
case 1: v->Padstack().BackOuterLayers().has_solder_mask = true; break;
case 2: v->Padstack().BackOuterLayers().has_solder_mask = false; break;
case 0: via->Padstack().BackOuterLayers().has_solder_mask.reset(); break;
case 1: via->Padstack().BackOuterLayers().has_solder_mask = true; break;
case 2: via->Padstack().BackOuterLayers().has_solder_mask = false; break;
}
if( !m_viaDrill.IsIndeterminate() )
v->SetDrill( m_viaDrill.GetIntValue() );
via->SetDrill( m_viaDrill.GetIntValue() );
TEARDROP_PARAMETERS* targetParams = &v->GetTeardropParams();
TEARDROP_PARAMETERS* targetParams = &via->GetTeardropParams();
if( m_cbTeardrops->Get3StateValue() != wxCHK_UNDETERMINED )
targetParams->m_Enabled = m_cbTeardrops->GetValue();
@ -791,7 +798,7 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
targetParams->m_CurvedEdges = m_curvedEdges->GetValue();
if( changeLock )
v->SetLocked( setLock );
via->SetLocked( setLock );
break;
}
@ -807,18 +814,18 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
// Pushing the commit will have updated the connectivity so we can now test to see if we
// need to update any pad nets.
auto connectivity = m_frame->GetBoard()->GetConnectivity();
int newNetCode = m_netSelector->GetSelectedNetcode();
bool updateNets = false;
std::vector<PAD*> changingPads;
auto connectivity = m_frame->GetBoard()->GetConnectivity();
int newNetCode = m_netSelector->GetSelectedNetcode();
bool updateNets = false;
std::set<PAD*> changingPads;
if ( !m_netSelector->IsIndeterminate() )
{
updateNets = true;
for( EDA_ITEM* item : m_items )
for( PCB_TRACK* track : tracks )
{
BOARD_CONNECTED_ITEM* boardItem = static_cast<BOARD_CONNECTED_ITEM*>( item );
BOARD_CONNECTED_ITEM* boardItem = static_cast<BOARD_CONNECTED_ITEM*>( track );
auto connectedItems = connectivity->GetConnectedItems( boardItem,
{ PCB_TRACE_T, PCB_ARC_T, PCB_PAD_T, PCB_VIA_T, PCB_FOOTPRINT_T }, true );
@ -828,8 +835,8 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
{
PAD* pad = static_cast<PAD*>( citem );
if( pad->GetNetCode() != newNetCode && !alg::contains( changingPads, citem ) )
changingPads.push_back( pad );
if( pad->GetNetCode() != newNetCode )
changingPads.insert( pad );
}
}
}

View File

@ -29,14 +29,14 @@
#include <layer_ids.h>
class PCB_SELECTION;
class PCB_BASE_FRAME;
class PCB_BASE_EDIT_FRAME;
class PAD;
class PADSTACK;
class DIALOG_TRACK_VIA_PROPERTIES : public DIALOG_TRACK_VIA_PROPERTIES_BASE
{
public:
DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent, const PCB_SELECTION& aItems );
DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, const PCB_SELECTION& aItems );
~DIALOG_TRACK_VIA_PROPERTIES();
@ -58,13 +58,13 @@ private:
void onUnitsChanged( wxCommandEvent& aEvent );
void onTeardropsUpdateUi( wxUpdateUIEvent& event ) override;
bool confirmPadChange( const std::vector<PAD*>& connectedPads );
bool confirmPadChange( const std::set<PAD*>& connectedPads );
int getLayerDepth();
void afterPadstackModeChanged();
private:
PCB_BASE_FRAME* m_frame;
PCB_BASE_EDIT_FRAME* m_frame;
const PCB_SELECTION& m_items; // List of items to be modified.
UNIT_BINDER m_trackStartX, m_trackStartY;