diff --git a/change_log.txt b/change_log.txt index d474e4fd14..42fda6eb01 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,14 +4,23 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2008-Jan-24 UPDATE Dick Hollenbeck +================================================================================ ++pcbnew: + * Export a specctra *.dsn file includes some padstacks, not ovals yet. + * Many many refinements to specctra.cpp and specctra.h. + * added COLLECTOR::BasePtr(), which is used in qsort. Could have used + * std::sort() instead. + * Wrote D_PAD::Compare() + * updated todo.txt + 2008-Jan-24 UPDATE Jean-Pierre Charras ================================================================================ +pcbnew: Bugs about fill zones removed (not all, of course). Fixed an old bug in block delete (could crashes pcbnew after deleting footprints). - 2008-Jan-23 UPDATE Dick Hollenbeck ================================================================================ +pcbnew: diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 5bcd1a3099..d34af53580 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -245,16 +245,15 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int (PCB_SCREEN*) panel->m_Parent->m_CurrentScreen : (PCB_SCREEN*) ActiveScreen; - if ( panel ) // Use current frame setting - { - frame = (WinEDA_BasePcbFrame*) panel->m_Parent; - } - else // Use board frame setting - if( DisplayOpt.DisplayPadFill == FILLED ) - fillpad = 1; + if ( panel ) // Use current frame setting + { + frame = (WinEDA_BasePcbFrame*) panel->m_Parent; + } + else if( DisplayOpt.DisplayPadFill == FILLED ) // Use board frame setting + fillpad = 1; - if( frame->m_DisplayPadFill == FILLED ) - fillpad = 1; + if( frame->m_DisplayPadFill == FILLED ) + fillpad = 1; zoom = screen->GetZoom(); #ifdef PCBNEW @@ -331,7 +330,6 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int } - //---------- // if PAD_SMD pad and high contrast mode if( m_Attribut==PAD_SMD && DisplayOpt.ContrastModeDisplay ) { @@ -376,8 +374,6 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int } } } - //--------- - if( draw_mode & GR_SURBRILL ) { @@ -463,6 +459,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int if( DisplayIsol ) { rotdx = rotdx + g_DesignSettings.m_TrackClearence + g_DesignSettings.m_TrackClearence; + GRCSegm( &panel->m_ClipBox, DC, ux0 + delta_cx, uy0 + delta_cy, ux0 - delta_cx, uy0 - delta_cy, rotdx, color ); @@ -499,7 +496,9 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int if( DisplayIsol ) { - dx += g_DesignSettings.m_TrackClearence; dy += g_DesignSettings.m_TrackClearence; + dx += g_DesignSettings.m_TrackClearence; + dy += g_DesignSettings.m_TrackClearence; + coord[0].x = -dx - ddy; coord[0].y = dy + ddx; @@ -763,97 +762,6 @@ int D_PAD::ReadDescr( FILE* File, int* LineNum ) } - -#if 0 -/***********************************/ -int D_PAD::WriteDescr( FILE* File ) -/***********************************/ - -/* Sauvegarde de la description d'un PAD - */ -{ - int cshape, NbLigne = 0;; - - const char* texttype; - - if( GetState( DELETED ) ) - return NbLigne; - - /* Generation du fichier pad: */ - fprintf( File, "$PAD\n" ); NbLigne++; - - switch( m_PadShape ) - { - case PAD_CIRCLE: - cshape = 'C'; break; - - case PAD_RECT: - cshape = 'R'; break; - - case PAD_OVAL: - cshape = 'O'; break; - - case PAD_TRAPEZOID: - cshape = 'T'; break; - - default: - cshape = 'C'; - DisplayError( NULL, _( "Unknown Pad shape" ) ); - break; - } - - fprintf( File, "Sh \"%.4s\" %c %d %d %d %d %d\n", - m_Padname, cshape, m_Size.x, m_Size.y, - m_DeltaSize.x, m_DeltaSize.y, m_Orient ); - NbLigne++; - fprintf( File, "Dr %d %d %d", m_Drill.x, m_Offset.x, m_Offset.y ); - if( m_DrillShape == PAD_OVAL ) - { - fprintf( File, " %c %d %d", 'O', m_Drill.x, m_Drill.y ); - } - fprintf( File, "\n" ); - - NbLigne++; - - switch( m_Attribut ) - { - case PAD_STANDARD: - texttype = "STD"; break; - - case PAD_SMD: - texttype = "SMD"; break; - - case PAD_CONN: - texttype = "CONN"; break; - - case PAD_P_HOLE: - texttype = "HOLE"; break; - - case MECA: - texttype = "MECA"; break; - - default: - texttype = "STD"; - DisplayError( NULL, wxT( "attribut Pad inconnu" ) ); - break; - } - - fprintf( File, "At %s N %8.8X\n", texttype, m_Masque_Layer ); - NbLigne++; - - fprintf( File, "Ne %d \"%s\"\n", GetNet(), CONV_TO_UTF8( m_Netname ) ); - NbLigne++; - - fprintf( File, "Po %d %d\n", m_Pos0.x, m_Pos0.y ); - NbLigne++; - - fprintf( File, "$EndPAD\n" ); - NbLigne++; - return NbLigne; -} -#endif - - bool D_PAD::Save( FILE* aFile ) const { int cshape; @@ -1167,8 +1075,66 @@ bool D_PAD::HitTest( const wxPoint& ref_pos ) } +/************************************************************/ +int D_PAD::Compare( const D_PAD* padref, const D_PAD* padcmp ) +/************************************************************/ +{ + int diff; + + if( (diff = padref->m_PadShape - padcmp->m_PadShape) ) + return diff; + if( (diff = padref->m_Size.x - padcmp->m_Size.x) ) + return diff; + if( (diff = padref->m_Size.y - padcmp->m_Size.y) ) + return diff; + if( (diff = padref->m_Offset.x - padcmp->m_Offset.x) ) + return diff; + if( (diff = padref->m_Offset.y - padcmp->m_Offset.y) ) + return diff; + if( (diff = padref->m_DeltaSize.x - padcmp->m_DeltaSize.x) ) + return diff; + if( (diff = padref->m_DeltaSize.y - padcmp->m_DeltaSize.y) ) + return diff; + + // @todo check if export_gencad still works: + // specctra_export needs this, but maybe export_gencad does not. added on Jan 24 2008 by Dick. + if( (diff = padref->m_Masque_Layer - padcmp->m_Masque_Layer) ) + return diff; + + return 0; +} + + #if defined (DEBUG) +// @todo: could this be useable elsewhere also? +static const char* ShowPadType( int aPadType ) +{ + switch( aPadType ) + { + case PAD_CIRCLE: return "circle"; + case PAD_OVAL: return "oval"; + case PAD_RECT: return "rect"; + case PAD_TRAPEZOID: return "trap"; + default: return "??unknown??"; + } +} + + +static const char* ShowPadAttr( int aPadAttr ) +{ + switch( aPadAttr ) + { + case PAD_STANDARD: return "STD"; + case PAD_SMD: return "SMD"; + case PAD_CONN: return "CONN"; + case PAD_P_HOLE: return "HOLE"; + case PAD_MECA: return "MECA"; + default: return "??unkown??"; + } +} + + /** * Function Show * is used to output the object tree, currently for debugging only. @@ -1186,6 +1152,8 @@ void D_PAD::Show( int nestLevel, std::ostream& os ) // for now, make it look like XML: NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << + " shape=\"" << ShowPadType( m_PadShape ) << '"' << + " attr=\"" << ShowPadAttr( m_Attribut ) << '"' << " num=\"" << padname << '"' << " net=\"" << m_Netname.mb_str() << '"' << " netcode=\"" << GetNet() << '"' << @@ -1196,5 +1164,4 @@ void D_PAD::Show( int nestLevel, std::ostream& os ) // NestedSpace( nestLevel, os ) << "\n"; } - #endif diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 9c01da133a..efed1c5a1a 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -27,12 +27,12 @@ public: wxString m_Netname; /* Net Name */ - int m_Masque_Layer; // Bitwise layer :1= copper layer, 15= cmp, + int m_Masque_Layer; // Bitwise layer :1= copper layer, 15= cmp, // 2..14 = internal layers // 16 .. 31 = technical layers - int m_PadShape; // Shape: PAD_CIRCLE, PAD_RECT, OVAL, TRAPEZOID - int m_DrillShape; // Shape PAD_CIRCLE, OVAL + int m_PadShape; // Shape: PAD_CIRCLE, PAD_RECT, PAD_OVAL, PAD_TRAPEZOID + int m_DrillShape; // Shape PAD_CIRCLE, PAD_OVAL wxSize m_Drill; // Drill diam (drill shape = PAD_CIRCLE) or drill size(shape = OVAL) // for drill shape = PAD_CIRCLE, drill diam = m_Drill.x @@ -152,6 +152,15 @@ public: { return wxT( "PAD" ); } + + + /** + * Function Compare + * compares two pads and return 0 if they are equal. + * @return int - <0 if left less than right, 0 if equal, >0 if left greater than right. + */ + static int Compare( const D_PAD* padref, const D_PAD* padcmp ); + #if defined (DEBUG) /** diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp index 6c7993a594..46d0d5651c 100644 --- a/pcbnew/export_gencad.cpp +++ b/pcbnew/export_gencad.cpp @@ -145,32 +145,11 @@ void WinEDA_PcbFrame::ExportToGenCAD( wxCommandEvent& event ) /**************************************************************************/ static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr ) /**************************************************************************/ - -/* - * Routine de tri de la liste des pads par type, puis pa taille - */ { - const D_PAD* padref, * padcmp; - int diff; + const D_PAD* padref = *(D_PAD**)refptr; + const D_PAD* padcmp = *(D_PAD**)objptr; - padref = *( (D_PAD**) refptr ); - padcmp = *( (D_PAD**) objptr ); - if( (diff = padref->m_PadShape - padcmp->m_PadShape) ) - return diff; - if( (diff = padref->m_Size.x - padcmp->m_Size.x) ) - return diff; - if( (diff = padref->m_Size.y - padcmp->m_Size.y) ) - return diff; - if( (diff = padref->m_Offset.x - padcmp->m_Offset.x) ) - return diff; - if( (diff = padref->m_Offset.y - padcmp->m_Offset.y) ) - return diff; - if( (diff = padref->m_DeltaSize.x - padcmp->m_DeltaSize.x) ) - return diff; - if( (diff = padref->m_DeltaSize.y - padcmp->m_DeltaSize.y) ) - return diff; - - return 0; + return D_PAD::Compare( padref, padcmp ); } @@ -209,15 +188,7 @@ void CreatePadsShapesSection( FILE* file, BOARD* pcb ) pad = *padlist; pad->m_logical_connexion = pad_name_number; - if( old_pad - && (old_pad->m_PadShape == pad->m_PadShape) - && (old_pad->m_Size.x == pad->m_Size.x) - && (old_pad->m_Size.y == pad->m_Size.y) - && (old_pad->m_Offset.x == pad->m_Offset.x) - && (old_pad->m_Offset.y == pad->m_Offset.y) - && (old_pad->m_DeltaSize.x == pad->m_DeltaSize.x) - && (old_pad->m_DeltaSize.y == pad->m_DeltaSize.y) - ) + if( old_pad && 0==D_PAD::Compare( old_pad, pad ) ) continue; // Forme deja generee old_pad = pad; diff --git a/todo.txt b/todo.txt index edf47a9dd7..5e7a19a8d8 100644 --- a/todo.txt +++ b/todo.txt @@ -70,3 +70,15 @@ asked by: jp Charras ================================================================================ Use the collector classes in eeschema. + +2008-Jan-24 Assigned To: nobody +asked by: Dick Hollenbeck +================================================================================ +See specctra.h's such comment +* @todo +* I would have liked to put the flipping logic into the ExportToSPECCTRA() +* function directly, but for some strange reason, +* void Change_Side_Module( MODULE* Module, wxDC* DC ) is a member of +* of class WinEDA_BasePcbFrame rather than class BOARD. +* +