Fix crash in footprint editor when SMD pad diameter is zero. (fixes lp:1378917)
This commit is contained in:
parent
1a550b8ef1
commit
149a04f331
|
@ -151,6 +151,7 @@ private:
|
||||||
void PadPropertiesAccept( wxCommandEvent& event );
|
void PadPropertiesAccept( wxCommandEvent& event );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* aPad )
|
void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* aPad )
|
||||||
{
|
{
|
||||||
DIALOG_PAD_PROPERTIES dlg( this, aPad );
|
DIALOG_PAD_PROPERTIES dlg( this, aPad );
|
||||||
|
@ -247,12 +248,39 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event )
|
||||||
// Calculate a suitable scale to fit the available draw area
|
// Calculate a suitable scale to fit the available draw area
|
||||||
int dim = m_dummyPad->GetSize().x + std::abs( m_dummyPad->GetDelta().y );
|
int dim = m_dummyPad->GetSize().x + std::abs( m_dummyPad->GetDelta().y );
|
||||||
|
|
||||||
|
// Invalid x size. User could enter zero, or have deleted all text prior to
|
||||||
|
// entering a new value; this is also treated as zero. If dim is left at
|
||||||
|
// zero, the drawing scale is zero and we get a crash.
|
||||||
|
if( dim == 0 )
|
||||||
|
{
|
||||||
|
// If drill size has been set, use that. Otherwise default to 1mm.
|
||||||
|
dim = m_dummyPad->GetDrillSize().x;
|
||||||
|
if( dim == 0 )
|
||||||
|
dim = 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
if( m_dummyPad->GetLocalClearance() > 0 )
|
if( m_dummyPad->GetLocalClearance() > 0 )
|
||||||
dim += m_dummyPad->GetLocalClearance() * 2;
|
dim += m_dummyPad->GetLocalClearance() * 2;
|
||||||
|
|
||||||
double scale = (double) dc_size.x / dim;
|
double scale = (double) dc_size.x / dim;
|
||||||
|
|
||||||
dim = m_dummyPad->GetSize().y + std::abs( m_dummyPad->GetDelta().x);
|
// If the pad is a circle, use the x size here instead.
|
||||||
|
int ysize;
|
||||||
|
if( m_dummyPad->GetShape() == PAD_CIRCLE )
|
||||||
|
ysize = m_dummyPad->GetSize().x;
|
||||||
|
else
|
||||||
|
ysize = m_dummyPad->GetSize().y;
|
||||||
|
|
||||||
|
dim = ysize + std::abs( m_dummyPad->GetDelta().x );
|
||||||
|
|
||||||
|
// Invalid y size. See note about x size above.
|
||||||
|
if( dim == 0 )
|
||||||
|
{
|
||||||
|
dim = m_dummyPad->GetDrillSize().y;
|
||||||
|
if( dim == 0 )
|
||||||
|
dim = 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
if( m_dummyPad->GetLocalClearance() > 0 )
|
if( m_dummyPad->GetLocalClearance() > 0 )
|
||||||
dim += m_dummyPad->GetLocalClearance() * 2;
|
dim += m_dummyPad->GetLocalClearance() * 2;
|
||||||
|
|
||||||
|
@ -710,6 +738,12 @@ bool DIALOG_PAD_PROPERTIES::padValuesOK()
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
||||||
// Test for incorrect values
|
// Test for incorrect values
|
||||||
|
if( (m_dummyPad->GetSize().x <= 0) ||
|
||||||
|
((m_dummyPad->GetSize().y <= 0) && (m_dummyPad->GetShape() != PAD_CIRCLE)) )
|
||||||
|
{
|
||||||
|
error_msgs.Add( _( "Pad size must be greater than zero" ) );
|
||||||
|
}
|
||||||
|
|
||||||
if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) ||
|
if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) ||
|
||||||
(m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) )
|
(m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue