diff --git a/change_log.txt b/change_log.txt index f014519d95..f65aafcad8 100644 --- a/change_log.txt +++ b/change_log.txt @@ -5,6 +5,14 @@ Please add newer entries at the top, list the date and your name with email address. +2007-Oct-15 UPDATE Geoff Harland +================================================================================ ++ pcbnew + * Made some changes involving vias so that these would have the correct value + of the Shape property assigned to them - while being created, and while files + are being saved, and while files are being loaded. + + 2007-Oct-14 UPDATE Dick Hollenbeck ================================================================================ + pcbnew: @@ -38,7 +46,6 @@ email address. with genliste.cpp.notused - 2007-Oct-12 UPDATE Dick Hollenbeck ================================================================================ + all @@ -70,8 +77,8 @@ email address. Does Recalcule_all_net_connexion() work, and why is not called from anywhere? - - + + 2007-Oct-11 UPDATE Dick Hollenbeck ================================================================================ + pcbnew @@ -82,7 +89,7 @@ email address. will redraw the DisplayPanel, now that SMD pads' colors are so dependent on these variables. - + 2007-Oct-11 UPDATE Dick Hollenbeck ================================================================================ + pcbnew diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index cc0352c937..4c329f1a64 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -206,14 +206,14 @@ SEARCH_RESULT TRACK::Visit( INSPECTOR* inspector, const void* testData, return SEARCH_QUIT; } - return SEARCH_CONTINUE; + return SEARCH_CONTINUE; } // see class_track.h bool SEGVIA::IsOnLayer( int layer_number ) const { -/* its the same logic, don't need this +/* its the same logic, don't need this int via_type = Shape(); if( via_type == VIA_NORMALE ) @@ -225,13 +225,12 @@ bool SEGVIA::IsOnLayer( int layer_number ) const } // VIA_BORGNE ou VIA_ENTERREE: -*/ - +*/ int bottom_layer, top_layer; - + ReturnLayerPair( &top_layer, &bottom_layer ); - - if( bottom_layer <= layer_number && layer_number <= top_layer ) + + if( bottom_layer <= layer_number && layer_number <= top_layer ) return true; else return false; @@ -250,18 +249,17 @@ int TRACK::ReturnMaskLayer() if( Type() == TYPEVIA ) { int via_type = Shape(); - + if( via_type == VIA_NORMALE ) return ALL_CU_LAYERS; // VIA_BORGNE ou VIA_ENTERREE: - - int bottom_layer; - int top_layer; + + int bottom_layer, top_layer; // ReturnLayerPair() knows how layers are stored ((SEGVIA*)this)->ReturnLayerPair( &top_layer, &bottom_layer ); - + int layermask = 0; while( bottom_layer <= top_layer ) { @@ -287,7 +285,7 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer ) if( via_type == VIA_NORMALE ) { - top_layer = LAYER_CMP_N; + top_layer = LAYER_CMP_N; bottom_layer = COPPER_LAYER_N; } @@ -549,6 +547,7 @@ bool TRACK::WriteTrackDescr( FILE* File ) /********************************************/ { int type = 0; + int shape; // Stores genuine value of via's shape property if( Type() == TYPEVIA ) type = 1; @@ -556,7 +555,50 @@ bool TRACK::WriteTrackDescr( FILE* File ) if( GetState( DELETED ) ) return FALSE; - fprintf( File, "Po %d %d %d %d %d %d %d\n", m_Shape, + // In the case of a via, check the values of its top_layer and + // bottom_layer properties, to determine what value should *really* + // be assigned to its shape property (as all versions of KiCad up + // until revision 335 (committed on 2007-Oct-13) could sometimes + // assign an inappropriate value to that property). + if( Type() == TYPEVIA ) + { +// int bottom_layer, top_layer; +// ((SEGVIA*)this)->ReturnLayerPair( &top_layer, &bottom_layer ); + + // For reasons of efficiency, replace the previous two commands + // with these (next three) commands. + + int bottom_layer = (m_Layer >> 4) & 15; + int top_layer = m_Layer & 15; + + if( bottom_layer > top_layer ) + EXCHG( bottom_layer, top_layer ); + + // Now determine what type of via this really is + if( bottom_layer == COPPER_LAYER_N && top_layer == CMP_N ) + { + // The via is really of a "standard" (through-hole) type + shape = VIA_NORMALE; + } + else if( bottom_layer == COPPER_LAYER_N || top_layer == CMP_N ) + { + // The via is really of a "blind" type + shape = VIA_BORGNE; + } + else + { + // The via is really of a "buried" type + shape = VIA_ENTERREE; + } + } + else + shape = m_Shape; // Cater for other (non-via) types of objects + +// fprintf( File, "Po %d %d %d %d %d %d %d\n", m_Shape, +// m_Start.x, m_Start.y, m_End.x, m_End.y, m_Width, m_Drill ); + + // (Replace m_Shape within the previous command with shape) + fprintf( File, "Po %d %d %d %d %d %d %d\n", shape, m_Start.x, m_Start.y, m_End.x, m_End.y, m_Width, m_Drill ); fprintf( File, "De %d %d %d %lX %X\n", @@ -701,8 +743,8 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode ) } /* Trace de l'isolation (pour segments type CUIVRE et TRACK uniquement */ - if( (DisplayOpt.DisplayTrackIsol) && (m_Layer <= CMP_N ) - && ( Type() == TYPETRACK) ) + if( DisplayOpt.DisplayTrackIsol && ( m_Layer <= CMP_N ) + && ( Type() == TYPETRACK ) ) { GRCSegm( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, m_End.x, m_End.y, @@ -903,11 +945,22 @@ void SEGVIA::Show( int nestLevel, std::ostream& os ) switch( Shape() ) { - case VIA_NORMALE: cp = "through"; break; - case VIA_ENTERREE: cp = "blind"; break; - case VIA_BORGNE: cp = "buried"; break; + case VIA_NORMALE: + cp = "through"; + break; + + case VIA_ENTERREE: + cp = "blind"; + break; + + case VIA_BORGNE: + cp = "buried"; + break; + default: - case VIA_NOT_DEFINED: cp = "undefined"; break; + case VIA_NOT_DEFINED: + cp = "undefined"; + break; } int topLayer; @@ -933,5 +986,3 @@ void SEGVIA::Show( int nestLevel, std::ostream& os ) #endif - - diff --git a/pcbnew/editrack-part2.cpp b/pcbnew/editrack-part2.cpp index 4e1c63e3fb..d3b1a7e456 100644 --- a/pcbnew/editrack-part2.cpp +++ b/pcbnew/editrack-part2.cpp @@ -214,42 +214,73 @@ void WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); - /* create the via */ - Via = new SEGVIA( m_Pcb ); - Via->m_Flags = IS_NEW; - Via->m_Width = g_DesignSettings.m_CurrentViaSize; - Via->m_Shape = g_DesignSettings.m_CurrentViaType; - Via->SetNet( g_HightLigth_NetCode ); - Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End; + // Create the via - but before doing so, determine what + // value should really be assigned to its Shape property. + // (Use ii to temporarily "store" the appropriate value.) int old_layer = GetScreen()->m_Active_Layer; - //swap the layers. + // swap the layers. if( GetScreen()->m_Active_Layer != GetScreen()->m_Route_Layer_TOP ) GetScreen()->m_Active_Layer = GetScreen()->m_Route_Layer_TOP; else GetScreen()->m_Active_Layer = GetScreen()->m_Route_Layer_BOTTOM; - - /* Adjust the via layer pair */ - if( Via->Shape() == VIA_ENTERREE ) + /* Assess the type of via */ + if( g_DesignSettings.m_CurrentViaType == VIA_NORMALE ) // normal via { - Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); + ii = VIA_NORMALE; } - - else if( Via->Shape() == VIA_BORGNE ) //blind via - { - // A revoir! ( la via devrait deboucher sur 1 cote ) - Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); - } - else - { + // Either a blind via or buried via was "requested", but still + // check both layers of the layer pair, to determine the truly + // appropriate value to assign to the via's Type property. + { + if( ( old_layer == COPPER_LAYER_N + && GetScreen()->m_Active_Layer == CMP_N ) + || ( old_layer == CMP_N + && GetScreen()->m_Active_Layer == COPPER_LAYER_N ) ) + { + // Specify the via's Shape property as Standard + ii = VIA_NORMALE; + } + else if( old_layer == COPPER_LAYER_N + || old_layer == CMP_N + || GetScreen()->m_Active_Layer == COPPER_LAYER_N + || GetScreen()->m_Active_Layer == CMP_N ) + { + // Specify the via's Shape property as Blind + ii = VIA_BORGNE; + } + else + { + // Specify the via's Shape property as Buried + ii = VIA_ENTERREE; + } + } + + Via = new SEGVIA( m_Pcb ); + Via->m_Flags = IS_NEW; + Via->m_Width = g_DesignSettings.m_CurrentViaSize; + Via->m_Shape = ii; // ( instead of g_DesignSettings.m_CurrentViaType ) + Via->SetNet( g_HightLigth_NetCode ); + Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End; + + /* Adjust the via layer pair */ + if( Via->Shape() == VIA_NORMALE ) // Normal via + { // Usual via is from copper to component; layer pair is 0 and 0x0F. Via->SetLayerPair( COPPER_LAYER_N, LAYER_CMP_N ); } - - if( Drc_On &&( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) ) + else // Either a blind via or buried via. + { + if( old_layer < GetScreen()->m_Active_Layer) + Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); + else + Via->SetLayerPair( GetScreen()->m_Active_Layer, old_layer ); + } + + if( Drc_On && ( Drc( this, DC, Via, m_Pcb->m_Track, 1 ) == BAD_DRC ) ) { /* DRC fault: the Via cannot be placed here ... */ delete Via; diff --git a/pcbnew/ioascii.cpp b/pcbnew/ioascii.cpp index 8211c3f46f..d33e8ecd27 100644 --- a/pcbnew/ioascii.cpp +++ b/pcbnew/ioascii.cpp @@ -170,9 +170,37 @@ int WinEDA_BasePcbFrame::ReadListeSegmentDescr( wxDC* DC, FILE* File, &PtSegm->m_End.x, &PtSegm->m_End.y, &width, &PtSegm->m_Drill ); - PtSegm->m_Width = width; + PtSegm->m_Width = width; + + // Before specifying the value for any new via's Shape property, check + // the values of its top_layer and bottom_layer properties, to determine + // what value should *really* be assigned to that property (as all + // versions of KiCad up until revision 335 (committed on 2007-Oct-13) + // could sometimes assign an inappropriate value to that property). + if( makeType == TYPEVIA ) + { + int b_layer = (layer >> 4) & 15; + int t_layer = layer & 15; + if( ( ( b_layer == COPPER_LAYER_N ) && ( t_layer == CMP_N ) ) + || ( ( b_layer == CMP_N ) && ( t_layer == COPPER_LAYER_N ) ) ) + { + // The via is really of a "standard" (through-hole) type + shape = VIA_NORMALE; + } + else if( ( b_layer == COPPER_LAYER_N ) || ( t_layer == CMP_N ) + || ( b_layer == CMP_N ) || ( t_layer == COPPER_LAYER_N ) ) + { + // The via is really of a "blind" type + shape = VIA_BORGNE; + } + else + { + // The via is really of a "buried" type + shape = VIA_ENTERREE; + } + } PtSegm->m_Shape = shape; - + if( arg_count < 7 ) PtSegm->m_Drill = -1;