JP Changes
This commit is contained in:
commit
23089d049c
|
@ -4,6 +4,15 @@ KiCad ChangeLog 2010
|
||||||
Please add newer entries at the top, list the date and your name with
|
Please add newer entries at the top, list the date and your name with
|
||||||
email address.
|
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>
|
2010-mar-31, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
================================================================================
|
================================================================================
|
||||||
++Pcbnew
|
++Pcbnew
|
||||||
|
|
Binary file not shown.
|
@ -6,10 +6,10 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KICAD_BUILD_VERSION
|
#ifndef KICAD_BUILD_VERSION
|
||||||
#define KICAD_BUILD_VERSION "(2010-03-30 SVN 2479)"
|
#define KICAD_BUILD_VERSION "(2010-04-08 SVN 25xx)"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define VERSION_STABILITY "final"
|
#define VERSION_STABILITY "unstable"
|
||||||
|
|
||||||
/** Function GetBuildVersion()
|
/** Function GetBuildVersion()
|
||||||
* Return the build date and version
|
* Return the build date and version
|
||||||
|
|
|
@ -76,7 +76,7 @@ GERBER_LAYER_WIDGET::GERBER_LAYER_WIDGET( WinEDA_GerberFrame* aParent, wxWindow*
|
||||||
}
|
}
|
||||||
|
|
||||||
AppendRenderRows( renderRows, DIM(renderRows) );
|
AppendRenderRows( renderRows, DIM(renderRows) );
|
||||||
|
|
||||||
// Update default tabs labels for gerbview
|
// Update default tabs labels for gerbview
|
||||||
SetLayersManagerTabsText( );
|
SetLayersManagerTabsText( );
|
||||||
|
|
||||||
|
@ -143,6 +143,7 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
|
||||||
int rowCount;
|
int rowCount;
|
||||||
int menuId = event.GetId();
|
int menuId = event.GetId();
|
||||||
bool visible;
|
bool visible;
|
||||||
|
int visibleLayers = 0;
|
||||||
|
|
||||||
switch( menuId )
|
switch( menuId )
|
||||||
{
|
{
|
||||||
|
@ -153,36 +154,19 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
|
||||||
case ID_SHOW_NO_COPPERS:
|
case ID_SHOW_NO_COPPERS:
|
||||||
visible = false;
|
visible = false;
|
||||||
L_change_coppers:
|
L_change_coppers:
|
||||||
int lastCu = -1;
|
|
||||||
rowCount = GetLayerRowCount();
|
rowCount = GetLayerRowCount();
|
||||||
for( int row=rowCount-1; row>=0; --row )
|
for( int row=0; row < rowCount; ++row )
|
||||||
{
|
{
|
||||||
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
|
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
|
||||||
int layer = getDecodedId( cb->GetId() );
|
cb->SetValue( visible );
|
||||||
if( IsValidCopperLayerIndex( layer ) )
|
if( visible )
|
||||||
{
|
visibleLayers |= (1 << row);
|
||||||
lastCu = row;
|
else
|
||||||
break;
|
visibleLayers &= ~(1 << row);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for( int row=0; row<rowCount; ++row )
|
myframe->GetBoard()->SetVisibleLayers( visibleLayers );
|
||||||
{
|
myframe->DrawPanel->Refresh();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
!define COPYRIGHT "Kicad Team (Jean-Pierre Charras et all)"
|
!define COPYRIGHT "Kicad Team (Jean-Pierre Charras et all)"
|
||||||
!define COMMENTS ""
|
!define COMMENTS ""
|
||||||
!define HELP_WEB_SITE "http://groups.yahoo.com/group/kicad-users/"
|
!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 WINGS3D_WEB_SITE "http://www.wings3d.com"
|
||||||
|
|
||||||
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
!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.
|
// and a call to wxASSERT can crash the application.
|
||||||
if( myclass )
|
if( myclass )
|
||||||
{
|
{
|
||||||
|
int myClearance = myclass->GetClearance();
|
||||||
// @todo : after GetNetClass() is reliably not returning NULL, remove the
|
// @todo : after GetNetClass() is reliably not returning NULL, remove the
|
||||||
// tests for if( myclass ) and if( hisclass )
|
// tests for if( myclass )
|
||||||
|
|
||||||
if( aItem )
|
if( aItem )
|
||||||
{
|
{
|
||||||
NETCLASS* hisclass = aItem->GetNetClass();
|
int hisClearance = aItem->GetClearance();
|
||||||
if( hisclass )
|
return max( hisClearance, myClearance );
|
||||||
{
|
|
||||||
int hisClearance = hisclass->GetClearance();
|
|
||||||
int myClearance = myclass->GetClearance();
|
|
||||||
return max( hisClearance, myClearance );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef __WXDEBUG__
|
|
||||||
wxLogWarning(wxT("BOARD_CONNECTED_ITEM::GetClearance(): NULL hisclass") );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return myclass->GetClearance();
|
return myClearance;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -201,37 +201,38 @@ void D_PAD::Copy( D_PAD* source )
|
||||||
|
|
||||||
|
|
||||||
/** Virtual function GetClearance
|
/** Virtual function GetClearance
|
||||||
* returns the clearance in 1/10000 inches. If \a aItem is not NULL then the
|
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||||
* returned clearance is the greater of this object's NETCLASS clearance and
|
* returned clearance is the greater of this object's clearance and
|
||||||
* aItem's NETCLASS clearance. If \a aItem is NULL, then this objects
|
* aItem's clearance. If \a aItem is NULL, then this objects
|
||||||
* clearance
|
* clearance
|
||||||
* is returned.
|
* is returned.
|
||||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
* @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
|
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;
|
int clearance = m_LocalClearance;
|
||||||
|
|
||||||
if( clearance == 0 )
|
if( clearance == 0 )
|
||||||
{
|
{ // If local clearance is 0, use the parent footprint clearance value
|
||||||
if( GetParent() && ( (MODULE*) GetParent() )->m_LocalClearance )
|
if( GetParent() && ( (MODULE*) GetParent() )->m_LocalClearance )
|
||||||
clearance = ( (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 );
|
return BOARD_CONNECTED_ITEM::GetClearance( aItem );
|
||||||
|
|
||||||
|
// We have a specific clearance.
|
||||||
|
// if aItem, return the biggest clearance
|
||||||
if( aItem )
|
if( aItem )
|
||||||
{
|
{
|
||||||
NETCLASS* hisclass = aItem->GetNetClass();
|
int hisClearance = aItem->GetClearance();
|
||||||
if( hisclass )
|
return max( hisClearance, clearance );
|
||||||
{
|
|
||||||
int hisClearance = hisclass->GetClearance();
|
|
||||||
return max( hisClearance, clearance );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the specific clearance.
|
||||||
return clearance;
|
return clearance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,12 +160,12 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetClearance
|
* Function GetClearance
|
||||||
* returns the clearance in 1/10000 inches. If \a aItem is not NULL then the
|
* returns the clearance in internal units. If \a aItem is not NULL then the
|
||||||
* returned clearance is the greater of this object's NETCLASS clearance and
|
* returned clearance is the greater of this object's clearance and
|
||||||
* aItem's NETCLASS clearance. If \a aItem is NULL, then this objects clearance
|
* aItem's clearance. If \a aItem is NULL, then this objects clearance
|
||||||
* is returned.
|
* is returned.
|
||||||
* @param aItem is another BOARD_CONNECTED_ITEM or NULL
|
* @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;
|
virtual int GetClearance( BOARD_CONNECTED_ITEM* aItem = NULL ) const;
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,22 @@ TRACK* TRACK::Copy() const
|
||||||
return NULL; // should never happen
|
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
|
* Function GetDrillValue
|
||||||
|
|
|
@ -275,6 +275,17 @@ public:
|
||||||
return wxT( "TRACK" );
|
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)
|
#if defined (DEBUG)
|
||||||
|
|
||||||
|
|
|
@ -551,6 +551,7 @@ void DIALOG_DRC_CONTROL::RedrawDrawPanel()
|
||||||
void DIALOG_DRC_CONTROL::DelDRCMarkers()
|
void DIALOG_DRC_CONTROL::DelDRCMarkers()
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
{
|
{
|
||||||
|
m_Parent->SetCurItem( NULL ); // clear curr item, because it could be a DRC marker
|
||||||
m_ClearanceListBox->DeleteAllItems();
|
m_ClearanceListBox->DeleteAllItems();
|
||||||
m_UnconnectedListBox->DeleteAllItems();
|
m_UnconnectedListBox->DeleteAllItems();
|
||||||
}
|
}
|
||||||
|
|
|
@ -704,7 +704,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
{
|
{
|
||||||
TRACK* track;
|
TRACK* track;
|
||||||
int dx, dy; // utilise pour calcul des dim x et dim y des segments
|
int dx, dy; // utilise pour calcul des dim x et dim y des segments
|
||||||
int w_dist;
|
|
||||||
int layerMask;
|
int layerMask;
|
||||||
int net_code_ref;
|
int net_code_ref;
|
||||||
wxPoint shape_pos;
|
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
|
D_PAD pseudo_pad( (MODULE*) NULL ); // construct this once outside following loop
|
||||||
|
|
||||||
// Compute the min distance to pads
|
// Compute the min distance to pads
|
||||||
w_dist = aRefSeg->m_Width >> 1;
|
int refsegm_half_width = aRefSeg->m_Width >> 1;
|
||||||
|
|
||||||
if( testPads )
|
if( testPads )
|
||||||
{
|
{
|
||||||
|
@ -842,7 +841,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
||||||
m_spotcx = pseudo_pad.GetPosition().x - org_X;
|
m_spotcx = pseudo_pad.GetPosition().x - org_X;
|
||||||
m_spotcy = pseudo_pad.GetPosition().y - org_Y;
|
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,
|
m_currentMarker = fillMarker( aRefSeg, pad,
|
||||||
DRCE_TRACK_NEAR_THROUGH_HOLE, m_currentMarker );
|
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_spotcx = shape_pos.x - org_X;
|
||||||
m_spotcy = shape_pos.y - org_Y;
|
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,
|
m_currentMarker = fillMarker( aRefSeg, pad,
|
||||||
DRCE_TRACK_NEAR_PAD, m_currentMarker );
|
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
|
// the minimum distance = clearance plus half the reference track
|
||||||
// width plus half the other track's width
|
// 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;
|
w_dist += (aRefSeg->m_Width + track->m_Width)/2;
|
||||||
|
|
||||||
// If the reference segment is a via, we test it here
|
// 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_dimx;
|
||||||
int p_dimy; // half the dimension of the pad
|
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 seuil;
|
||||||
int deltay;
|
int deltay;
|
||||||
|
|
||||||
seuil = w_segm + dist_min;
|
seuil = w_segm + aMinDist;
|
||||||
p_dimx = pad_to_test->m_Size.x >> 1;
|
p_dimx = pad_to_test->m_Size.x >> 1;
|
||||||
p_dimy = pad_to_test->m_Size.y >> 1;
|
p_dimy = pad_to_test->m_Size.y >> 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue