diff --git a/CHANGELOG.txt b/CHANGELOG.txt index b35f1158f5..35eda0bc43 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -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 +================================================================================ +++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 ================================================================================ ++Pcbnew diff --git a/Documentation/kicad_export.xml.bz2 b/Documentation/kicad_export.xml.bz2 new file mode 100644 index 0000000000..7f8ee98a4f Binary files /dev/null and b/Documentation/kicad_export.xml.bz2 differ diff --git a/common/build_version.cpp b/common/build_version.cpp index 1c02a3715d..0b6e20f0b4 100644 --- a/common/build_version.cpp +++ b/common/build_version.cpp @@ -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 diff --git a/gerbview/class_gerbview_layer_widget.cpp b/gerbview/class_gerbview_layer_widget.cpp index ffa7d1f9da..5f4e29654f 100644 --- a/gerbview/class_gerbview_layer_widget.cpp +++ b/gerbview/class_gerbview_layer_widget.cpp @@ -76,7 +76,7 @@ GERBER_LAYER_WIDGET::GERBER_LAYER_WIDGET( WinEDA_GerberFrame* aParent, wxWindow* } AppendRenderRows( renderRows, DIM(renderRows) ); - + // Update default tabs labels for gerbview SetLayersManagerTabsText( ); @@ -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; - } + cb->SetValue( visible ); + if( visible ) + visibleLayers |= (1 << row); + else + visibleLayers &= ~(1 << row); } - for( int row=0; rowGetId() ); - - if( IsValidCopperLayerIndex( layer ) ) - { - cb->SetValue( visible ); - - bool isLastCopperLayer = (row==lastCu); - - OnLayerVisible( layer, visible, isLastCopperLayer ); - - if( isLastCopperLayer ) - break; - } - } + myframe->GetBoard()->SetVisibleLayers( visibleLayers ); + myframe->DrawPanel->Refresh(); break; } } diff --git a/packaging/windows/nsis/install.nsi b/packaging/windows/nsis/install.nsi index 8fb0b8363a..975bfaf94d 100644 --- a/packaging/windows/nsis/install.nsi +++ b/packaging/windows/nsis/install.nsi @@ -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}" diff --git a/pcbnew/class_board_connected_item.cpp b/pcbnew/class_board_connected_item.cpp index 0fc73f42cc..ae89f5f9cd 100644 --- a/pcbnew/class_board_connected_item.cpp +++ b/pcbnew/class_board_connected_item.cpp @@ -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(); - return max( hisClearance, myClearance ); - } - else - { -#ifdef __WXDEBUG__ - wxLogWarning(wxT("BOARD_CONNECTED_ITEM::GetClearance(): NULL hisclass") ); -#endif - } + int hisClearance = aItem->GetClearance(); + return max( hisClearance, myClearance ); } - return myclass->GetClearance(); + return myClearance; } else { diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 042295752e..8eecf909d5 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -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(); - return max( hisClearance, clearance ); - } + int hisClearance = aItem->GetClearance(); + return max( hisClearance, clearance ); } + // Return the specific clearance. return clearance; } diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index fef7e2b733..d599161c87 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -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; diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index cfff496a3f..9890bb922f 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -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 diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 59ce3c3daa..364b8a9264 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -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) diff --git a/pcbnew/dialog_drc.cpp b/pcbnew/dialog_drc.cpp index 64e5f3b31c..32819f24f6 100644 --- a/pcbnew/dialog_drc.cpp +++ b/pcbnew/dialog_drc.cpp @@ -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(); } diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index 3d07c84534..8078b32dfc 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -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;