D_PAD::Compare()

This commit is contained in:
dickelbeck 2008-01-24 21:50:12 +00:00
parent 1969a51173
commit f50ec6e0b8
5 changed files with 110 additions and 142 deletions

View File

@ -4,14 +4,23 @@ Started 2007-June-11
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.
2008-Jan-24 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+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 <jean-pierre.charras@inpg.fr> 2008-Jan-24 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================ ================================================================================
+pcbnew: +pcbnew:
Bugs about fill zones removed (not all, of course). Bugs about fill zones removed (not all, of course).
Fixed an old bug in block delete (could crashes pcbnew after deleting footprints). Fixed an old bug in block delete (could crashes pcbnew after deleting footprints).
2008-Jan-23 UPDATE Dick Hollenbeck <dick@softplc.com> 2008-Jan-23 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
+pcbnew: +pcbnew:

View File

@ -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*) panel->m_Parent->m_CurrentScreen :
(PCB_SCREEN*) ActiveScreen; (PCB_SCREEN*) ActiveScreen;
if ( panel ) // Use current frame setting if ( panel ) // Use current frame setting
{ {
frame = (WinEDA_BasePcbFrame*) panel->m_Parent; frame = (WinEDA_BasePcbFrame*) panel->m_Parent;
} }
else // Use board frame setting else if( DisplayOpt.DisplayPadFill == FILLED ) // Use board frame setting
if( DisplayOpt.DisplayPadFill == FILLED ) fillpad = 1;
fillpad = 1;
if( frame->m_DisplayPadFill == FILLED ) if( frame->m_DisplayPadFill == FILLED )
fillpad = 1; fillpad = 1;
zoom = screen->GetZoom(); zoom = screen->GetZoom();
#ifdef PCBNEW #ifdef PCBNEW
@ -331,7 +330,6 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
} }
//-----<test this>-----
// if PAD_SMD pad and high contrast mode // if PAD_SMD pad and high contrast mode
if( m_Attribut==PAD_SMD && DisplayOpt.ContrastModeDisplay ) if( m_Attribut==PAD_SMD && DisplayOpt.ContrastModeDisplay )
{ {
@ -376,8 +374,6 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
} }
} }
} }
//-----</test this>----
if( draw_mode & GR_SURBRILL ) if( draw_mode & GR_SURBRILL )
{ {
@ -463,6 +459,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
if( DisplayIsol ) if( DisplayIsol )
{ {
rotdx = rotdx + g_DesignSettings.m_TrackClearence + g_DesignSettings.m_TrackClearence; rotdx = rotdx + g_DesignSettings.m_TrackClearence + g_DesignSettings.m_TrackClearence;
GRCSegm( &panel->m_ClipBox, DC, ux0 + delta_cx, uy0 + delta_cy, GRCSegm( &panel->m_ClipBox, DC, ux0 + delta_cx, uy0 + delta_cy,
ux0 - delta_cx, uy0 - delta_cy, ux0 - delta_cx, uy0 - delta_cy,
rotdx, color ); rotdx, color );
@ -499,7 +496,9 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
if( DisplayIsol ) 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].x = -dx - ddy;
coord[0].y = dy + ddx; 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 bool D_PAD::Save( FILE* aFile ) const
{ {
int cshape; 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) #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 * Function Show
* is used to output the object tree, currently for debugging only. * 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: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" shape=\"" << ShowPadType( m_PadShape ) << '"' <<
" attr=\"" << ShowPadAttr( m_Attribut ) << '"' <<
" num=\"" << padname << '"' << " num=\"" << padname << '"' <<
" net=\"" << m_Netname.mb_str() << '"' << " net=\"" << m_Netname.mb_str() << '"' <<
" netcode=\"" << GetNet() << '"' << " netcode=\"" << GetNet() << '"' <<
@ -1196,5 +1164,4 @@ void D_PAD::Show( int nestLevel, std::ostream& os )
// NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n"; // NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }
#endif #endif

View File

@ -27,12 +27,12 @@ public:
wxString m_Netname; /* Net Name */ 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 // 2..14 = internal layers
// 16 .. 31 = technical layers // 16 .. 31 = technical layers
int m_PadShape; // Shape: PAD_CIRCLE, PAD_RECT, OVAL, TRAPEZOID int m_PadShape; // Shape: PAD_CIRCLE, PAD_RECT, PAD_OVAL, PAD_TRAPEZOID
int m_DrillShape; // Shape PAD_CIRCLE, OVAL int m_DrillShape; // Shape PAD_CIRCLE, PAD_OVAL
wxSize m_Drill; // Drill diam (drill shape = PAD_CIRCLE) or drill size(shape = 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 // for drill shape = PAD_CIRCLE, drill diam = m_Drill.x
@ -152,6 +152,15 @@ public:
{ {
return wxT( "PAD" ); 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) #if defined (DEBUG)
/** /**

View File

@ -145,32 +145,11 @@ void WinEDA_PcbFrame::ExportToGenCAD( wxCommandEvent& event )
/**************************************************************************/ /**************************************************************************/
static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr ) 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; const D_PAD* padref = *(D_PAD**)refptr;
int diff; const D_PAD* padcmp = *(D_PAD**)objptr;
padref = *( (D_PAD**) refptr ); return D_PAD::Compare( padref, padcmp );
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;
} }
@ -209,15 +188,7 @@ void CreatePadsShapesSection( FILE* file, BOARD* pcb )
pad = *padlist; pad = *padlist;
pad->m_logical_connexion = pad_name_number; pad->m_logical_connexion = pad_name_number;
if( old_pad if( old_pad && 0==D_PAD::Compare( old_pad, 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)
)
continue; // Forme deja generee continue; // Forme deja generee
old_pad = pad; old_pad = pad;

View File

@ -70,3 +70,15 @@ asked by: jp Charras
================================================================================ ================================================================================
Use the collector classes in eeschema. 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.
*