Pcbnew, clean board: fix issues and add option in dialog to remove bad track segments (short circuit between 2 nets)
This commit is contained in:
parent
1ebac06d2f
commit
b5839893d0
148
pcbnew/clean.cpp
148
pcbnew/clean.cpp
|
@ -1,9 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-2010 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr
|
* Copyright (C) 2004-2016 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors.
|
* Copyright (C) 1992-2016 KiCad Developers, see change_log.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -51,9 +51,16 @@ public:
|
||||||
/**
|
/**
|
||||||
* the cleanup function.
|
* the cleanup function.
|
||||||
* return true if some item was modified
|
* return true if some item was modified
|
||||||
|
* @param aFrame = the PCB_EDIT_FRAME which handles the board
|
||||||
|
* @param aRemoveMisConnected = true to remove segments connecting 2 different nets
|
||||||
|
* @param aCleanVias = true to remove superimposed vias
|
||||||
|
* @param aMergeSegments = true to merge collinear segmenst and remove 0 len segm
|
||||||
|
* @param aDeleteUnconnected = true to remove dangling tracks
|
||||||
|
* (short circuits)
|
||||||
*/
|
*/
|
||||||
bool CleanupBoard( PCB_EDIT_FRAME *aFrame, bool aCleanVias,
|
bool CleanupBoard( PCB_EDIT_FRAME *aFrame, bool aCleanVias,
|
||||||
bool aMergeSegments, bool aDeleteUnconnected);
|
bool aRemoveMisConnected,
|
||||||
|
bool aMergeSegments, bool aDeleteUnconnected );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -77,7 +84,7 @@ private:
|
||||||
/**
|
/**
|
||||||
* Removes dangling tracks
|
* Removes dangling tracks
|
||||||
*/
|
*/
|
||||||
bool deleteUnconnectedTracks();
|
bool deleteDanglingTracks();
|
||||||
|
|
||||||
/// Delete null length track segments
|
/// Delete null length track segments
|
||||||
bool delete_null_segments();
|
bool delete_null_segments();
|
||||||
|
@ -121,16 +128,16 @@ void PCB_EDIT_FRAME::Clean_Pcb()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Old model has to be refreshed, GAL normally does not keep updating it
|
// Old model has to be refreshed, GAL normally does not keep updating it
|
||||||
if( IsGalCanvasActive() )
|
Compile_Ratsnest( NULL, false );
|
||||||
Compile_Ratsnest( NULL, false );
|
|
||||||
|
|
||||||
wxBusyCursor( dummy );
|
wxBusyCursor( dummy );
|
||||||
TRACKS_CLEANER cleaner( GetBoard() );
|
TRACKS_CLEANER cleaner( GetBoard() );
|
||||||
|
|
||||||
cleaner.CleanupBoard( this, dlg.m_cleanVias, dlg.m_mergeSegments,
|
cleaner.CleanupBoard( this, dlg.m_deleteShortCircuits, dlg.m_cleanVias,
|
||||||
dlg.m_deleteUnconnectedSegm );
|
dlg.m_mergeSegments, dlg.m_deleteUnconnectedSegm );
|
||||||
|
|
||||||
// There is a chance that some of tracks have changed their nets, so rebuild ratsnest from scratch
|
// There is a chance that some of tracks have changed their nets,
|
||||||
|
// so rebuild ratsnest from scratch
|
||||||
if( IsGalCanvasActive() )
|
if( IsGalCanvasActive() )
|
||||||
GetBoard()->GetRatsnest()->ProcessBoard();
|
GetBoard()->GetRatsnest()->ProcessBoard();
|
||||||
|
|
||||||
|
@ -143,10 +150,9 @@ void PCB_EDIT_FRAME::Clean_Pcb()
|
||||||
* - Redundant points on tracks (merge aligned segments)
|
* - Redundant points on tracks (merge aligned segments)
|
||||||
* - vias on pad
|
* - vias on pad
|
||||||
* - null length segments
|
* - null length segments
|
||||||
* Create segments when track ends are incorrectly connected:
|
|
||||||
* i.e. when a track end covers a pad or a via but is not exactly on the pad or the via center
|
|
||||||
*/
|
*/
|
||||||
bool TRACKS_CLEANER::CleanupBoard( PCB_EDIT_FRAME *aFrame,
|
bool TRACKS_CLEANER::CleanupBoard( PCB_EDIT_FRAME *aFrame,
|
||||||
|
bool aRemoveMisConnected,
|
||||||
bool aCleanVias,
|
bool aCleanVias,
|
||||||
bool aMergeSegments,
|
bool aMergeSegments,
|
||||||
bool aDeleteUnconnected )
|
bool aDeleteUnconnected )
|
||||||
|
@ -154,19 +160,24 @@ bool TRACKS_CLEANER::CleanupBoard( PCB_EDIT_FRAME *aFrame,
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
|
|
||||||
// delete redundant vias
|
// delete redundant vias
|
||||||
modified |= (aCleanVias && clean_vias());
|
if( aCleanVias )
|
||||||
|
modified |= clean_vias();
|
||||||
|
|
||||||
// Remove null segments and intermediate points on aligned segments
|
// Remove null segments and intermediate points on aligned segments
|
||||||
modified |= (aMergeSegments && clean_segments());
|
if( aMergeSegments )
|
||||||
|
modified |= clean_segments();
|
||||||
|
|
||||||
|
if( aRemoveMisConnected )
|
||||||
|
modified |= aFrame->RemoveMisConnectedTracks();
|
||||||
|
|
||||||
// Delete dangling tracks
|
// Delete dangling tracks
|
||||||
if( aDeleteUnconnected && deleteUnconnectedTracks() )
|
if( aDeleteUnconnected && deleteDanglingTracks() )
|
||||||
{
|
{
|
||||||
modified = true ;
|
modified = true ;
|
||||||
|
|
||||||
// Removed tracks can leave aligned segments
|
// Removed tracks can leave aligned segments
|
||||||
// (when a T was formed by tracks and the "vertical" segment
|
// (when a T was formed by tracks and the "vertical" segment
|
||||||
// is removed;
|
// is removed)
|
||||||
if( aMergeSegments )
|
if( aMergeSegments )
|
||||||
clean_segments();
|
clean_segments();
|
||||||
}
|
}
|
||||||
|
@ -207,6 +218,7 @@ void TRACKS_CLEANER::buildTrackConnectionInfo()
|
||||||
|
|
||||||
// Build connections info tracks to pads
|
// Build connections info tracks to pads
|
||||||
SearchTracksConnectedToPads();
|
SearchTracksConnectedToPads();
|
||||||
|
|
||||||
for( TRACK *track = m_Brd->m_Track; track != NULL; track = track->Next() )
|
for( TRACK *track = m_Brd->m_Track; track != NULL; track = track->Next() )
|
||||||
{
|
{
|
||||||
// Mark track if connected to pads
|
// Mark track if connected to pads
|
||||||
|
@ -263,7 +275,7 @@ bool TRACKS_CLEANER::clean_vias()
|
||||||
// Correct via m_End defects (if any), should never happen
|
// Correct via m_End defects (if any), should never happen
|
||||||
if( via->GetStart() != via->GetEnd() )
|
if( via->GetStart() != via->GetEnd() )
|
||||||
{
|
{
|
||||||
wxFAIL_MSG( wxT( "Via with mismatching ends" ) );
|
wxFAIL_MSG( "Malformed via with mismatching ends" );
|
||||||
via->SetEnd( via->GetStart() );
|
via->SetEnd( via->GetStart() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,22 +372,23 @@ bool TRACKS_CLEANER::testTrackEndpointDangling( TRACK *aTrack, ENDPOINT_T aEndPo
|
||||||
return flag_erase;
|
return flag_erase;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Delete dangling tracks
|
||||||
* Delete dangling tracks
|
|
||||||
* Vias:
|
* Vias:
|
||||||
* If a via is only connected to a dangling track, it also will be removed
|
* If a via is only connected to a dangling track, it also will be removed
|
||||||
*/
|
*/
|
||||||
bool TRACKS_CLEANER::deleteUnconnectedTracks()
|
bool TRACKS_CLEANER::deleteDanglingTracks()
|
||||||
{
|
{
|
||||||
if( m_Brd->m_Track == NULL )
|
if( m_Brd->m_Track == NULL )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
bool item_erased;
|
bool item_erased;
|
||||||
|
|
||||||
do // Iterate when at least one track is deleted
|
do // Iterate when at least one track is deleted
|
||||||
{
|
{
|
||||||
item_erased = false;
|
item_erased = false;
|
||||||
TRACK* next_track;
|
TRACK* next_track;
|
||||||
|
|
||||||
for( TRACK *track = m_Brd->m_Track; track != NULL; track = next_track )
|
for( TRACK *track = m_Brd->m_Track; track != NULL; track = next_track )
|
||||||
{
|
{
|
||||||
next_track = track->Next();
|
next_track = track->Next();
|
||||||
|
@ -474,7 +487,6 @@ bool TRACKS_CLEANER::merge_collinear_of_track( TRACK *aSegment )
|
||||||
{
|
{
|
||||||
bool merged_this = false;
|
bool merged_this = false;
|
||||||
|
|
||||||
// *WHY* doesn't C++ have prec and succ (or ++ --) like PASCAL?
|
|
||||||
for( ENDPOINT_T endpoint = ENDPOINT_START; endpoint <= ENDPOINT_END;
|
for( ENDPOINT_T endpoint = ENDPOINT_START; endpoint <= ENDPOINT_END;
|
||||||
endpoint = ENDPOINT_T( endpoint + 1 ) )
|
endpoint = ENDPOINT_T( endpoint + 1 ) )
|
||||||
{
|
{
|
||||||
|
@ -529,6 +541,7 @@ bool TRACKS_CLEANER::clean_segments()
|
||||||
modified |= delete_null_segments();
|
modified |= delete_null_segments();
|
||||||
|
|
||||||
// Delete redundant segments, i.e. segments having the same end points and layers
|
// Delete redundant segments, i.e. segments having the same end points and layers
|
||||||
|
// (can happens when blocks are copied on themselve)
|
||||||
for( TRACK *segment = m_Brd->m_Track; segment; segment = segment->Next() )
|
for( TRACK *segment = m_Brd->m_Track; segment; segment = segment->Next() )
|
||||||
modified |= remove_duplicates_of_track( segment );
|
modified |= remove_duplicates_of_track( segment );
|
||||||
|
|
||||||
|
@ -680,80 +693,73 @@ TRACK* TRACKS_CLEANER::mergeCollinearSegmentIfPossible( TRACK* aTrackRef, TRACK*
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::RemoveMisConnectedTracks()
|
bool PCB_EDIT_FRAME::RemoveMisConnectedTracks()
|
||||||
{
|
{
|
||||||
/* finds all track segments which are mis-connected (to more than one net).
|
/* finds all track segments which are connected to more than one net.
|
||||||
* When such a bad segment is found, it is flagged to be removed.
|
* When such a bad segment is found, it is flagged.
|
||||||
* All tracks having at least one flagged segment are removed.
|
* All flagged segments are removed.
|
||||||
*/
|
*/
|
||||||
TRACK* segment;
|
Compile_Ratsnest( NULL, false );
|
||||||
TRACK* other;
|
|
||||||
TRACK* next;
|
|
||||||
int net_code_s, net_code_e;
|
|
||||||
bool isModified = false;
|
|
||||||
|
|
||||||
for( segment = GetBoard()->m_Track; segment; segment = segment->Next() )
|
// Rebuild physical connections.
|
||||||
|
// the list of physical connected items to a given item is in
|
||||||
|
// m_PadsConnected and m_TracksConnected members of each item
|
||||||
|
CONNECTIONS connections( GetBoard() );
|
||||||
|
connections.BuildPadsList();
|
||||||
|
connections.BuildTracksCandidatesList(GetBoard()->m_Track);
|
||||||
|
|
||||||
|
// build connections between track segments and pads.
|
||||||
|
connections.SearchTracksConnectedToPads();
|
||||||
|
|
||||||
|
TRACK* segment;
|
||||||
|
|
||||||
|
// build connections between track ends
|
||||||
|
for( segment = GetBoard()->m_Track; segment; segment = segment->Next() )
|
||||||
|
{
|
||||||
|
connections.SearchConnectedTracks( segment );
|
||||||
|
connections.GetConnectedTracks( segment );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isModified = false;
|
||||||
|
|
||||||
|
for( segment = GetBoard()->m_Track; segment; segment = segment->Next() )
|
||||||
{
|
{
|
||||||
segment->SetState( FLAG0, false );
|
segment->SetState( FLAG0, false );
|
||||||
|
|
||||||
// find the netcode for segment using anything connected to the "start" of "segment"
|
for( unsigned ii = 0; ii < segment->m_PadsConnected.size(); ++ii )
|
||||||
net_code_s = -1;
|
|
||||||
|
|
||||||
if( segment->start && segment->start->Type()==PCB_PAD_T )
|
|
||||||
{
|
{
|
||||||
// get the netcode of the pad to propagate.
|
if( segment->GetNetCode() != segment->m_PadsConnected[ii]->GetNetCode() )
|
||||||
net_code_s = ((D_PAD*)(segment->start))->GetNetCode();
|
segment->SetState( FLAG0, true );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
other = segment->GetTrack( GetBoard()->m_Track, NULL, ENDPOINT_START, false, false );
|
|
||||||
|
|
||||||
if( other )
|
|
||||||
net_code_s = other->GetNetCode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( net_code_s < 0 )
|
for( unsigned ii = 0; ii < segment->m_TracksConnected.size(); ++ii )
|
||||||
continue; // the "start" of segment is not connected
|
|
||||||
|
|
||||||
// find the netcode for segment using anything connected to the "end" of "segment"
|
|
||||||
net_code_e = -1;
|
|
||||||
|
|
||||||
if( segment->end && segment->end->Type()==PCB_PAD_T )
|
|
||||||
{
|
{
|
||||||
net_code_e = ((D_PAD*)(segment->end))->GetNetCode();
|
TRACK* tested = segment->m_TracksConnected[ii];
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
other = segment->GetTrack( GetBoard()->m_Track, NULL, ENDPOINT_END, false, false );
|
|
||||||
|
|
||||||
if( other )
|
if( segment->GetNetCode() != tested->GetNetCode() && !tested->GetState( FLAG0 ) )
|
||||||
net_code_e = other->GetNetCode();
|
segment->SetState( FLAG0, true );
|
||||||
}
|
|
||||||
|
|
||||||
if( net_code_e < 0 )
|
|
||||||
continue; // the "end" of segment is not connected
|
|
||||||
|
|
||||||
// Netcodes do not agree, so mark the segment as "to be removed"
|
|
||||||
if( net_code_s != net_code_e )
|
|
||||||
{
|
|
||||||
segment->SetState( FLAG0, true );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove tracks having a flagged segment
|
// Remove tracks having a flagged segment
|
||||||
|
TRACK* next;
|
||||||
for( segment = GetBoard()->m_Track; segment; segment = next )
|
for( segment = GetBoard()->m_Track; segment; segment = next )
|
||||||
{
|
{
|
||||||
next = segment->Next();
|
next = segment->Next();
|
||||||
|
|
||||||
if( segment->GetState( FLAG0 ) ) // Segment is flagged to be removed
|
if( segment->GetState( FLAG0 ) ) // Segment is flagged to be removed
|
||||||
{
|
{
|
||||||
segment->SetState( FLAG0, false );
|
|
||||||
isModified = true;
|
isModified = true;
|
||||||
GetBoard()->m_Status_Pcb = 0;
|
GetBoard()->m_Status_Pcb = 0;
|
||||||
Remove_One_Track( NULL, segment );
|
GetBoard()->Remove( segment );
|
||||||
|
delete segment; // TODO: See if it can be put in undo list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// the current segment is deleted,
|
if( isModified )
|
||||||
// we do not know the next "not yet tested" segment,
|
{ // some pointers are invalid. Clear the m_TracksConnected list,
|
||||||
// so restart to the beginning
|
// to avoid any issue
|
||||||
next = GetBoard()->m_Track;
|
for( segment = GetBoard()->m_Track; segment; segment = segment->Next() )
|
||||||
|
{
|
||||||
|
segment->m_TracksConnected.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ DIALOG_CLEANING_OPTIONS::DIALOG_CLEANING_OPTIONS( wxWindow* parent ):
|
||||||
m_cleanViasOpt->SetValue( m_cleanVias );
|
m_cleanViasOpt->SetValue( m_cleanVias );
|
||||||
m_mergeSegmOpt->SetValue( m_mergeSegments );
|
m_mergeSegmOpt->SetValue( m_mergeSegments );
|
||||||
m_deleteUnconnectedOpt->SetValue( m_deleteUnconnectedSegm );
|
m_deleteUnconnectedOpt->SetValue( m_deleteUnconnectedSegm );
|
||||||
|
m_cleanShortCircuitOpt->SetValue( m_deleteShortCircuits );
|
||||||
|
|
||||||
m_sdbSizerOK->SetDefault();
|
m_sdbSizerOK->SetDefault();
|
||||||
GetSizer()->SetSizeHints(this);
|
GetSizer()->SetSizeHints(this);
|
||||||
|
@ -45,4 +46,5 @@ DIALOG_CLEANING_OPTIONS::DIALOG_CLEANING_OPTIONS( wxWindow* parent ):
|
||||||
bool DIALOG_CLEANING_OPTIONS::m_cleanVias = true;
|
bool DIALOG_CLEANING_OPTIONS::m_cleanVias = true;
|
||||||
bool DIALOG_CLEANING_OPTIONS::m_mergeSegments = true;
|
bool DIALOG_CLEANING_OPTIONS::m_mergeSegments = true;
|
||||||
bool DIALOG_CLEANING_OPTIONS::m_deleteUnconnectedSegm = true;
|
bool DIALOG_CLEANING_OPTIONS::m_deleteUnconnectedSegm = true;
|
||||||
|
bool DIALOG_CLEANING_OPTIONS::m_deleteShortCircuits = true;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010-2014 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr
|
* Copyright (C) 2010-2014 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr
|
||||||
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -33,32 +33,20 @@ public:
|
||||||
static bool m_cleanVias;
|
static bool m_cleanVias;
|
||||||
static bool m_mergeSegments;
|
static bool m_mergeSegments;
|
||||||
static bool m_deleteUnconnectedSegm;
|
static bool m_deleteUnconnectedSegm;
|
||||||
|
static bool m_deleteShortCircuits;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DIALOG_CLEANING_OPTIONS( wxWindow* parent );
|
DIALOG_CLEANING_OPTIONS( wxWindow* parent );
|
||||||
|
|
||||||
~DIALOG_CLEANING_OPTIONS()
|
bool TransferDataFromWindow() override
|
||||||
{
|
{
|
||||||
GetOpts( );
|
m_cleanVias = m_cleanViasOpt->GetValue( );
|
||||||
|
m_mergeSegments = m_mergeSegmOpt->GetValue( );
|
||||||
|
m_deleteUnconnectedSegm = m_deleteUnconnectedOpt->GetValue( );
|
||||||
|
m_deleteShortCircuits = m_cleanShortCircuitOpt->GetValue( );
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
void OnCancelClick( wxCommandEvent& event ) override
|
|
||||||
{
|
|
||||||
EndModal( wxID_CANCEL );
|
|
||||||
}
|
|
||||||
void OnOKClick( wxCommandEvent& event ) override
|
|
||||||
{
|
|
||||||
GetOpts( );
|
|
||||||
EndModal( wxID_OK );
|
|
||||||
}
|
|
||||||
|
|
||||||
void GetOpts( )
|
|
||||||
{
|
|
||||||
m_cleanVias = m_cleanViasOpt->GetValue( );
|
|
||||||
m_mergeSegments = m_mergeSegmOpt->GetValue( );
|
|
||||||
m_deleteUnconnectedSegm = m_deleteUnconnectedOpt->GetValue( );
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Mar 13 2015)
|
// C++ code generated with wxFormBuilder (version Sep 8 2016)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -19,8 +19,13 @@ DIALOG_CLEANING_OPTIONS_BASE::DIALOG_CLEANING_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
wxBoxSizer* bSizerUpper;
|
wxBoxSizer* bSizerUpper;
|
||||||
bSizerUpper = new wxBoxSizer( wxVERTICAL );
|
bSizerUpper = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
m_cleanShortCircuitOpt = new wxCheckBox( this, wxID_ANY, _("Delete &track segments connecting different nets"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_cleanShortCircuitOpt->SetToolTip( _("remove track segments connecting nodes belonging to different nets (short circuit)") );
|
||||||
|
|
||||||
|
bSizerUpper->Add( m_cleanShortCircuitOpt, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_cleanViasOpt = new wxCheckBox( this, wxID_ANY, _("&Delete redundant vias"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_cleanViasOpt = new wxCheckBox( this, wxID_ANY, _("&Delete redundant vias"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_cleanViasOpt->SetToolTip( _("remove vias on pads with a through hole") );
|
m_cleanViasOpt->SetToolTip( _("remove vias on through hole pads and superimposed vias") );
|
||||||
|
|
||||||
bSizerUpper->Add( m_cleanViasOpt, 0, wxALL, 5 );
|
bSizerUpper->Add( m_cleanViasOpt, 0, wxALL, 5 );
|
||||||
|
|
||||||
|
@ -29,8 +34,8 @@ DIALOG_CLEANING_OPTIONS_BASE::DIALOG_CLEANING_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
|
|
||||||
bSizerUpper->Add( m_mergeSegmOpt, 0, wxALL, 5 );
|
bSizerUpper->Add( m_mergeSegmOpt, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_deleteUnconnectedOpt = new wxCheckBox( this, wxID_ANY, _("D&elete unconnected tracks"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_deleteUnconnectedOpt = new wxCheckBox( this, wxID_ANY, _("Delete &dangling tracks"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_deleteUnconnectedOpt->SetToolTip( _("delete track segment having a dangling end") );
|
m_deleteUnconnectedOpt->SetToolTip( _("delete tracks having at least one dangling end") );
|
||||||
|
|
||||||
bSizerUpper->Add( m_deleteUnconnectedOpt, 0, wxALL, 5 );
|
bSizerUpper->Add( m_deleteUnconnectedOpt, 0, wxALL, 5 );
|
||||||
|
|
||||||
|
@ -54,16 +59,8 @@ DIALOG_CLEANING_OPTIONS_BASE::DIALOG_CLEANING_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
this->Layout();
|
this->Layout();
|
||||||
|
|
||||||
this->Centre( wxBOTH );
|
this->Centre( wxBOTH );
|
||||||
|
|
||||||
// Connect Events
|
|
||||||
m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CLEANING_OPTIONS_BASE::OnCancelClick ), NULL, this );
|
|
||||||
m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CLEANING_OPTIONS_BASE::OnOKClick ), NULL, this );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DIALOG_CLEANING_OPTIONS_BASE::~DIALOG_CLEANING_OPTIONS_BASE()
|
DIALOG_CLEANING_OPTIONS_BASE::~DIALOG_CLEANING_OPTIONS_BASE()
|
||||||
{
|
{
|
||||||
// Disconnect Events
|
|
||||||
m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CLEANING_OPTIONS_BASE::OnCancelClick ), NULL, this );
|
|
||||||
m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CLEANING_OPTIONS_BASE::OnOKClick ), NULL, this );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">DIALOG_CLEANING_OPTIONS_BASE</property>
|
<property name="name">DIALOG_CLEANING_OPTIONS_BASE</property>
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="size">257,185</property>
|
<property name="size">342,179</property>
|
||||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||||
<property name="title">Cleaning Options</property>
|
<property name="title">Cleaning Options</property>
|
||||||
|
@ -102,6 +102,94 @@
|
||||||
<property name="name">bSizerUpper</property>
|
<property name="name">bSizerUpper</property>
|
||||||
<property name="orient">wxVERTICAL</property>
|
<property name="orient">wxVERTICAL</property>
|
||||||
<property name="permission">none</property>
|
<property name="permission">none</property>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxALL</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxCheckBox" expanded="1">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></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="checked">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="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">Delete &track segments connecting different nets</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_cleanShortCircuitOpt</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"></property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip">remove track segments connecting nodes belonging to different nets (short circuit)</property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NUMERIC</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="OnChar"></event>
|
||||||
|
<event name="OnCheckBox"></event>
|
||||||
|
<event name="OnEnterWindow"></event>
|
||||||
|
<event name="OnEraseBackground"></event>
|
||||||
|
<event name="OnKeyDown"></event>
|
||||||
|
<event name="OnKeyUp"></event>
|
||||||
|
<event name="OnKillFocus"></event>
|
||||||
|
<event name="OnLeaveWindow"></event>
|
||||||
|
<event name="OnLeftDClick"></event>
|
||||||
|
<event name="OnLeftDown"></event>
|
||||||
|
<event name="OnLeftUp"></event>
|
||||||
|
<event name="OnMiddleDClick"></event>
|
||||||
|
<event name="OnMiddleDown"></event>
|
||||||
|
<event name="OnMiddleUp"></event>
|
||||||
|
<event name="OnMotion"></event>
|
||||||
|
<event name="OnMouseEvents"></event>
|
||||||
|
<event name="OnMouseWheel"></event>
|
||||||
|
<event name="OnPaint"></event>
|
||||||
|
<event name="OnRightDClick"></event>
|
||||||
|
<event name="OnRightDown"></event>
|
||||||
|
<event name="OnRightUp"></event>
|
||||||
|
<event name="OnSetFocus"></event>
|
||||||
|
<event name="OnSize"></event>
|
||||||
|
<event name="OnUpdateUI"></event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxALL</property>
|
<property name="flag">wxALL</property>
|
||||||
|
@ -156,7 +244,7 @@
|
||||||
<property name="style"></property>
|
<property name="style"></property>
|
||||||
<property name="subclass"></property>
|
<property name="subclass"></property>
|
||||||
<property name="toolbar_pane">0</property>
|
<property name="toolbar_pane">0</property>
|
||||||
<property name="tooltip">remove vias on pads with a through hole</property>
|
<property name="tooltip">remove vias on through hole pads and superimposed vias</property>
|
||||||
<property name="validator_data_type"></property>
|
<property name="validator_data_type"></property>
|
||||||
<property name="validator_style">wxFILTER_NUMERIC</property>
|
<property name="validator_style">wxFILTER_NUMERIC</property>
|
||||||
<property name="validator_type">wxDefaultValidator</property>
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
@ -311,7 +399,7 @@
|
||||||
<property name="gripper">0</property>
|
<property name="gripper">0</property>
|
||||||
<property name="hidden">0</property>
|
<property name="hidden">0</property>
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="label">D&elete unconnected tracks</property>
|
<property name="label">Delete &dangling tracks</property>
|
||||||
<property name="max_size"></property>
|
<property name="max_size"></property>
|
||||||
<property name="maximize_button">0</property>
|
<property name="maximize_button">0</property>
|
||||||
<property name="maximum_size"></property>
|
<property name="maximum_size"></property>
|
||||||
|
@ -332,7 +420,7 @@
|
||||||
<property name="style"></property>
|
<property name="style"></property>
|
||||||
<property name="subclass"></property>
|
<property name="subclass"></property>
|
||||||
<property name="toolbar_pane">0</property>
|
<property name="toolbar_pane">0</property>
|
||||||
<property name="tooltip">delete track segment having a dangling end</property>
|
<property name="tooltip">delete tracks having at least one dangling end</property>
|
||||||
<property name="validator_data_type"></property>
|
<property name="validator_data_type"></property>
|
||||||
<property name="validator_style">wxFILTER_NUMERIC</property>
|
<property name="validator_style">wxFILTER_NUMERIC</property>
|
||||||
<property name="validator_type">wxDefaultValidator</property>
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
@ -466,11 +554,11 @@
|
||||||
<property name="name">m_sdbSizer</property>
|
<property name="name">m_sdbSizer</property>
|
||||||
<property name="permission">protected</property>
|
<property name="permission">protected</property>
|
||||||
<event name="OnApplyButtonClick"></event>
|
<event name="OnApplyButtonClick"></event>
|
||||||
<event name="OnCancelButtonClick">OnCancelClick</event>
|
<event name="OnCancelButtonClick"></event>
|
||||||
<event name="OnContextHelpButtonClick"></event>
|
<event name="OnContextHelpButtonClick"></event>
|
||||||
<event name="OnHelpButtonClick"></event>
|
<event name="OnHelpButtonClick"></event>
|
||||||
<event name="OnNoButtonClick"></event>
|
<event name="OnNoButtonClick"></event>
|
||||||
<event name="OnOKButtonClick">OnOKClick</event>
|
<event name="OnOKButtonClick"></event>
|
||||||
<event name="OnSaveButtonClick"></event>
|
<event name="OnSaveButtonClick"></event>
|
||||||
<event name="OnYesButtonClick"></event>
|
<event name="OnYesButtonClick"></event>
|
||||||
</object>
|
</object>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Mar 13 2015)
|
// C++ code generated with wxFormBuilder (version Sep 8 2016)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -36,6 +36,7 @@ class DIALOG_CLEANING_OPTIONS_BASE : public DIALOG_SHIM
|
||||||
private:
|
private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
wxCheckBox* m_cleanShortCircuitOpt;
|
||||||
wxCheckBox* m_cleanViasOpt;
|
wxCheckBox* m_cleanViasOpt;
|
||||||
wxCheckBox* m_mergeSegmOpt;
|
wxCheckBox* m_mergeSegmOpt;
|
||||||
wxCheckBox* m_deleteUnconnectedOpt;
|
wxCheckBox* m_deleteUnconnectedOpt;
|
||||||
|
@ -43,15 +44,10 @@ class DIALOG_CLEANING_OPTIONS_BASE : public DIALOG_SHIM
|
||||||
wxStdDialogButtonSizer* m_sdbSizer;
|
wxStdDialogButtonSizer* m_sdbSizer;
|
||||||
wxButton* m_sdbSizerOK;
|
wxButton* m_sdbSizerOK;
|
||||||
wxButton* m_sdbSizerCancel;
|
wxButton* m_sdbSizerCancel;
|
||||||
|
|
||||||
// Virtual event handlers, overide them in your derived class
|
|
||||||
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
|
|
||||||
virtual void OnOKClick( wxCommandEvent& event ) { event.Skip(); }
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DIALOG_CLEANING_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Cleaning Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 257,185 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
DIALOG_CLEANING_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Cleaning Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 342,179 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||||
~DIALOG_CLEANING_OPTIONS_BASE();
|
~DIALOG_CLEANING_OPTIONS_BASE();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -431,8 +431,8 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool
|
||||||
switch( item->Type() )
|
switch( item->Type() )
|
||||||
{
|
{
|
||||||
case PCB_MODULE_T:
|
case PCB_MODULE_T:
|
||||||
deep_reBuild_ratsnest = true;
|
deep_reBuild_ratsnest = true; // Pointers on pads can be invalid
|
||||||
// Fall though
|
// Fall through
|
||||||
case PCB_ZONE_AREA_T:
|
case PCB_ZONE_AREA_T:
|
||||||
case PCB_TRACE_T:
|
case PCB_TRACE_T:
|
||||||
case PCB_VIA_T:
|
case PCB_VIA_T:
|
||||||
|
|
Loading…
Reference in New Issue