Pcbnew: fixed an inconsistency in DRC. (see changelog)
fixed others very minor bugs.
This commit is contained in:
parent
47692df718
commit
32ff242157
|
@ -4,6 +4,15 @@ KiCad ChangeLog 2010
|
|||
Please add newer entries at the top, list the date and your name with
|
||||
email address.
|
||||
|
||||
2010-apr-08, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||
================================================================================
|
||||
++Pcbnew:
|
||||
Drc: take in account the clearance "local parameters" for pads that have local parameters.
|
||||
Until now, only NETCLASS clearance values were used.
|
||||
(local parameters are used in zone filling)
|
||||
But because a pad (or a footprint) can have a specific clearance value
|
||||
Drc used now this value, and NETCLASS value only if no local value specified.
|
||||
|
||||
2010-mar-31, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||
================================================================================
|
||||
++Pcbnew
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
#endif
|
||||
|
||||
#ifndef KICAD_BUILD_VERSION
|
||||
#define KICAD_BUILD_VERSION "(2010-03-30 SVN 2479)"
|
||||
#define KICAD_BUILD_VERSION "(2010-04-08 SVN 25xx)"
|
||||
#endif
|
||||
|
||||
#define VERSION_STABILITY "final"
|
||||
#define VERSION_STABILITY "unstable"
|
||||
|
||||
/** Function GetBuildVersion()
|
||||
* Return the build date and version
|
||||
|
|
|
@ -143,6 +143,7 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
|
|||
int rowCount;
|
||||
int menuId = event.GetId();
|
||||
bool visible;
|
||||
int visibleLayers = 0;
|
||||
|
||||
switch( menuId )
|
||||
{
|
||||
|
@ -153,36 +154,19 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
|
|||
case ID_SHOW_NO_COPPERS:
|
||||
visible = false;
|
||||
L_change_coppers:
|
||||
int lastCu = -1;
|
||||
rowCount = GetLayerRowCount();
|
||||
for( int row=rowCount-1; row>=0; --row )
|
||||
for( int row=0; row < rowCount; ++row )
|
||||
{
|
||||
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
|
||||
int layer = getDecodedId( cb->GetId() );
|
||||
if( IsValidCopperLayerIndex( layer ) )
|
||||
{
|
||||
lastCu = row;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for( int row=0; row<rowCount; ++row )
|
||||
{
|
||||
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
|
||||
int layer = getDecodedId( cb->GetId() );
|
||||
|
||||
if( IsValidCopperLayerIndex( layer ) )
|
||||
{
|
||||
cb->SetValue( visible );
|
||||
|
||||
bool isLastCopperLayer = (row==lastCu);
|
||||
|
||||
OnLayerVisible( layer, visible, isLastCopperLayer );
|
||||
|
||||
if( isLastCopperLayer )
|
||||
break;
|
||||
}
|
||||
if( visible )
|
||||
visibleLayers |= (1 << row);
|
||||
else
|
||||
visibleLayers &= ~(1 << row);
|
||||
}
|
||||
|
||||
myframe->GetBoard()->SetVisibleLayers( visibleLayers );
|
||||
myframe->DrawPanel->Refresh();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
!define COPYRIGHT "Kicad Team (Jean-Pierre Charras et all)"
|
||||
!define COMMENTS ""
|
||||
!define HELP_WEB_SITE "http://groups.yahoo.com/group/kicad-users/"
|
||||
!define DEVEL_WEB_SITE "http://groups.yahoo.com/group/kicad-devel/"
|
||||
!define DEVEL_WEB_SITE "https://launchpad.net/~kicad-developers/"
|
||||
!define WINGS3D_WEB_SITE "http://www.wings3d.com"
|
||||
|
||||
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
||||
|
|
|
@ -78,27 +78,17 @@ int BOARD_CONNECTED_ITEM::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
|
|||
// and a call to wxASSERT can crash the application.
|
||||
if( myclass )
|
||||
{
|
||||
int myClearance = myclass->GetClearance();
|
||||
// @todo : after GetNetClass() is reliably not returning NULL, remove the
|
||||
// tests for if( myclass ) and if( hisclass )
|
||||
// tests for if( myclass )
|
||||
|
||||
if( aItem )
|
||||
{
|
||||
NETCLASS* hisclass = aItem->GetNetClass();
|
||||
if( hisclass )
|
||||
{
|
||||
int hisClearance = hisclass->GetClearance();
|
||||
int myClearance = myclass->GetClearance();
|
||||
int hisClearance = aItem->GetClearance();
|
||||
return max( hisClearance, myClearance );
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef __WXDEBUG__
|
||||
wxLogWarning(wxT("BOARD_CONNECTED_ITEM::GetClearance(): NULL hisclass") );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return myclass->GetClearance();
|
||||
return myClearance;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -201,37 +201,38 @@ void D_PAD::Copy( D_PAD* source )
|
|||
|
||||
|
||||
/** Virtual function GetClearance
|
||||
* returns the clearance in 1/10000 inches. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's NETCLASS clearance and
|
||||
* aItem's NETCLASS clearance. If \a aItem is NULL, then this objects
|
||||
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's clearance and
|
||||
* aItem's clearance. If \a aItem is NULL, then this objects
|
||||
* clearance
|
||||
* is returned.
|
||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
||||
* @return int - the clearance in 1/10000 inches.
|
||||
* @return int - the clearance in internal units.
|
||||
*/
|
||||
int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
|
||||
{
|
||||
// A pad can have specific clearance parameters that
|
||||
// overrides its NETCLASS clearance value
|
||||
int clearance = m_LocalClearance;
|
||||
|
||||
if( clearance == 0 )
|
||||
{
|
||||
{ // If local clearance is 0, use the parent footprint clearance value
|
||||
if( GetParent() && ( (MODULE*) GetParent() )->m_LocalClearance )
|
||||
clearance = ( (MODULE*) GetParent() )->m_LocalClearance;
|
||||
}
|
||||
|
||||
if( clearance == 0 )
|
||||
if( clearance == 0 ) // If the parent footprint clearance value = 0, use NETCLASS value
|
||||
return BOARD_CONNECTED_ITEM::GetClearance( aItem );
|
||||
|
||||
// We have a specific clearance.
|
||||
// if aItem, return the biggest clearance
|
||||
if( aItem )
|
||||
{
|
||||
NETCLASS* hisclass = aItem->GetNetClass();
|
||||
if( hisclass )
|
||||
{
|
||||
int hisClearance = hisclass->GetClearance();
|
||||
int hisClearance = aItem->GetClearance();
|
||||
return max( hisClearance, clearance );
|
||||
}
|
||||
}
|
||||
|
||||
// Return the specific clearance.
|
||||
return clearance;
|
||||
}
|
||||
|
||||
|
|
|
@ -160,12 +160,12 @@ public:
|
|||
|
||||
/**
|
||||
* Function GetClearance
|
||||
* returns the clearance in 1/10000 inches. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's NETCLASS clearance and
|
||||
* aItem's NETCLASS clearance. If \a aItem is NULL, then this objects clearance
|
||||
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's clearance and
|
||||
* aItem's clearance. If \a aItem is NULL, then this objects clearance
|
||||
* is returned.
|
||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
||||
* @return int - the clearance in 1/10000 inches.
|
||||
* @return int - the clearance in internal units.
|
||||
*/
|
||||
virtual int GetClearance( BOARD_CONNECTED_ITEM* aItem = NULL ) const;
|
||||
|
||||
|
|
|
@ -107,6 +107,22 @@ TRACK* TRACK::Copy() const
|
|||
return NULL; // should never happen
|
||||
}
|
||||
|
||||
/** Virtual function GetClearance
|
||||
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's clearance and
|
||||
* aItem's clearance. If \a aItem is NULL, then this objects
|
||||
* clearance
|
||||
* is returned.
|
||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
||||
* @return int - the clearance in internal units.
|
||||
*/
|
||||
int TRACK::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
|
||||
{
|
||||
// Currently tracks have no specific clearance parameter
|
||||
// on a per track or per segment basis.
|
||||
// the NETCLASS clearance is used
|
||||
return BOARD_CONNECTED_ITEM::GetClearance( aItem );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function GetDrillValue
|
||||
|
|
|
@ -275,6 +275,17 @@ public:
|
|||
return wxT( "TRACK" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Function GetClearance
|
||||
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||
* returned clearance is the greater of this object's clearance and
|
||||
* aItem's clearance. If \a aItem is NULL, then this objects clearance
|
||||
* is returned.
|
||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
||||
* @return int - the clearance in internal units.
|
||||
*/
|
||||
virtual int GetClearance( BOARD_CONNECTED_ITEM* aItem = NULL ) const;
|
||||
|
||||
|
||||
#if defined (DEBUG)
|
||||
|
||||
|
|
|
@ -551,6 +551,7 @@ void DIALOG_DRC_CONTROL::RedrawDrawPanel()
|
|||
void DIALOG_DRC_CONTROL::DelDRCMarkers()
|
||||
/*********************************************************/
|
||||
{
|
||||
m_Parent->SetCurItem( NULL ); // clear curr item, because it could be a DRC marker
|
||||
m_ClearanceListBox->DeleteAllItems();
|
||||
m_UnconnectedListBox->DeleteAllItems();
|
||||
}
|
||||
|
|
|
@ -704,7 +704,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
{
|
||||
TRACK* track;
|
||||
int dx, dy; // utilise pour calcul des dim x et dim y des segments
|
||||
int w_dist;
|
||||
int layerMask;
|
||||
int net_code_ref;
|
||||
wxPoint shape_pos;
|
||||
|
@ -813,7 +812,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
D_PAD pseudo_pad( (MODULE*) NULL ); // construct this once outside following loop
|
||||
|
||||
// Compute the min distance to pads
|
||||
w_dist = aRefSeg->m_Width >> 1;
|
||||
int refsegm_half_width = aRefSeg->m_Width >> 1;
|
||||
|
||||
if( testPads )
|
||||
{
|
||||
|
@ -842,7 +841,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
m_spotcx = pseudo_pad.GetPosition().x - org_X;
|
||||
m_spotcy = pseudo_pad.GetPosition().y - org_Y;
|
||||
|
||||
if( !checkClearanceSegmToPad( &pseudo_pad, w_dist, netclass->GetClearance() ))
|
||||
if( !checkClearanceSegmToPad( &pseudo_pad, refsegm_half_width, netclass->GetClearance() ))
|
||||
{
|
||||
m_currentMarker = fillMarker( aRefSeg, pad,
|
||||
DRCE_TRACK_NEAR_THROUGH_HOLE, m_currentMarker );
|
||||
|
@ -863,7 +862,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
m_spotcx = shape_pos.x - org_X;
|
||||
m_spotcy = shape_pos.y - org_Y;
|
||||
|
||||
if( !checkClearanceSegmToPad( pad, w_dist, aRefSeg->GetClearance( pad ) ) )
|
||||
if( !checkClearanceSegmToPad( pad, refsegm_half_width, aRefSeg->GetClearance( pad ) ) )
|
||||
{
|
||||
m_currentMarker = fillMarker( aRefSeg, pad,
|
||||
DRCE_TRACK_NEAR_PAD, m_currentMarker );
|
||||
|
@ -897,7 +896,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
|
||||
// the minimum distance = clearance plus half the reference track
|
||||
// width plus half the other track's width
|
||||
w_dist = aRefSeg->GetClearance( track );
|
||||
int w_dist = aRefSeg->GetClearance( track );
|
||||
w_dist += (aRefSeg->m_Width + track->m_Width)/2;
|
||||
|
||||
// If the reference segment is a via, we test it here
|
||||
|
@ -1423,7 +1422,7 @@ exit: // the only way out (hopefully) for simpler debugging
|
|||
}
|
||||
|
||||
|
||||
bool DRC::checkClearanceSegmToPad( const D_PAD* pad_to_test, int w_segm, int dist_min )
|
||||
bool DRC::checkClearanceSegmToPad( const D_PAD* pad_to_test, int w_segm, int aMinDist )
|
||||
{
|
||||
int p_dimx;
|
||||
int p_dimy; // half the dimension of the pad
|
||||
|
@ -1432,7 +1431,7 @@ bool DRC::checkClearanceSegmToPad( const D_PAD* pad_to_test, int w_segm, int dis
|
|||
int seuil;
|
||||
int deltay;
|
||||
|
||||
seuil = w_segm + dist_min;
|
||||
seuil = w_segm + aMinDist;
|
||||
p_dimx = pad_to_test->m_Size.x >> 1;
|
||||
p_dimy = pad_to_test->m_Size.y >> 1;
|
||||
|
||||
|
|
Loading…
Reference in New Issue