specctra export pad fixes

This commit is contained in:
dickelbeck 2008-02-08 15:00:50 +00:00
parent 7dbb0da3bb
commit 40e2fed36e
1 changed files with 81 additions and 67 deletions

View File

@ -434,7 +434,8 @@ PADSTACK* SPECCTRA_DB::makeVia( int aCopperDiameter )
void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads ) void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
{ {
char name[80]; // padstack name builder char name[80]; // padstack name builder
std::string uniqifier;
if( aPads.GetCount() ) if( aPads.GetCount() )
{ {
@ -466,9 +467,7 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
if( (!doLayer[0] && !doLayer[1]) if( (!doLayer[0] && !doLayer[1])
|| (pad->m_PadShape==PAD_CIRCLE && pad->m_Drill.x >= pad->m_Size.x) ) || (pad->m_PadShape==PAD_CIRCLE && pad->m_Drill.x >= pad->m_Size.x) )
{ {
// padstacks.size()-1 is the index of the matching padstack in LIBRARY::padstacks // pad->m_logical_connexion = pcb->library->padstacks.size()-1;
pad->m_logical_connexion = pcb->library->padstacks.size()-1;
continue; continue;
} }
@ -480,19 +479,49 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
// padstacks.size()-1 is the index of the matching padstack in LIBRARY::padstacks // padstacks.size()-1 is the index of the matching padstack in LIBRARY::padstacks
pad->m_logical_connexion = pcb->library->padstacks.size()-1; pad->m_logical_connexion = pcb->library->padstacks.size()-1;
// For now, we will report only one layer for the pads. SMD pads are reported on the /* Through hole pads are reported on the <reserved_layer_name>
// top layer, and through hole are reported on <reserved_layer_name> "signal". "signal". Reporting through hole pads on the special
// We could do better if there was actually a "layer type" field within "signal" layer may have problems when power layers are in the layer
// Kicad which would hold one of: T_signal, T_power, T_mixed, T_jumper stack. See bottom of page 74 of the SECCTRA Design Language
// See bottom of page 74 of the SECCTRA Design Language Reference, May 2000. Reference, May 2000. We could do better if there was actually a
int reportedLayers = 1; // how many layers are reported. "layer type" field within Kicad which would hold one of: T_signal,
T_power, T_mixed, T_jumper.
doLayer[0] = true; PAD_SMD and PAD_CONN are reported on each layer for which
they are present.
*/
const char* layerName = ( pad->m_Attribut == PAD_SMD ) ? int reportedLayers; // how many layers are reported.
layerIds[0].c_str() : "signal"; const char* layerName[NB_COPPER_LAYERS];
int coppers = 0; // will always be one for now static const char signal[] = "signal";
if( pad->m_Attribut==PAD_SMD || pad->m_Attribut==PAD_CONN )
{
reportedLayers = 0;
uniqifier = '[';
if( doLayer[0] )
{
layerName[reportedLayers++] = layerIds[0].c_str();
uniqifier += 'T'; // T for top, could have used a layer index here alternatively
}
if( doLayer[1] )
{
int pcbLayerNdx = kicadLayer2pcb[COPPER_LAYER_N];
layerName[reportedLayers++] = layerIds[ pcbLayerNdx ].c_str();
uniqifier += 'B'; // B for bottom
}
uniqifier += ']';
}
else
{
reportedLayers = 1;
layerName[0] = signal;
uniqifier = "[A]"; // A for all
}
switch( pad->m_PadShape ) switch( pad->m_PadShape )
{ {
@ -501,23 +530,20 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
{ {
double diameter = scale(pad->m_Size.x); double diameter = scale(pad->m_Size.x);
for( int layer=0; layer<reportedLayers; ++layer ) for( int ndx=0; ndx<reportedLayers; ++ndx )
{ {
if( doLayer[layer] ) SHAPE* shape = new SHAPE( padstack );
{ padstack->Append( shape );
SHAPE* shape = new SHAPE( padstack );
padstack->Append( shape );
CIRCLE* circle = new CIRCLE( shape ); CIRCLE* circle = new CIRCLE( shape );
shape->SetShape( circle ); shape->SetShape( circle );
circle->SetLayerId( layerName ); circle->SetLayerId( layerName[ndx] );
circle->SetDiameter( diameter ); circle->SetDiameter( diameter );
++coppers;
}
} }
snprintf( name, sizeof(name), "Round%dPad_%.6g_mil", coppers, scale(pad->m_Size.x) ); snprintf( name, sizeof(name), "Round%sPad_%.6g_mil",
uniqifier.c_str(), scale(pad->m_Size.x) );
name[ sizeof(name)-1 ] = 0; name[ sizeof(name)-1 ] = 0;
// @todo verify that all pad names are unique, there is a chance that // @todo verify that all pad names are unique, there is a chance that
@ -536,24 +562,20 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
POINT lowerLeft( -dx, -dy ); POINT lowerLeft( -dx, -dy );
POINT upperRight( dx, dy ); POINT upperRight( dx, dy );
for( int layer=0; layer<reportedLayers; ++layer ) for( int ndx=0; ndx<reportedLayers; ++ndx )
{ {
if( doLayer[layer] ) SHAPE* shape = new SHAPE( padstack );
{ padstack->Append( shape );
SHAPE* shape = new SHAPE( padstack );
padstack->Append( shape );
RECTANGLE* rect = new RECTANGLE( shape ); RECTANGLE* rect = new RECTANGLE( shape );
shape->SetShape( rect ); shape->SetShape( rect );
rect->SetLayerId( layerName ); rect->SetLayerId( layerName[ndx] );
rect->SetCorners( lowerLeft, upperRight ); rect->SetCorners( lowerLeft, upperRight );
++coppers;
}
} }
snprintf( name, sizeof(name), "Rect%dPad_%.6gx%.6g_mil", snprintf( name, sizeof(name), "Rect%sPad_%.6gx%.6g_mil",
coppers, scale(pad->m_Size.x), scale(pad->m_Size.y) ); uniqifier.c_str(), scale(pad->m_Size.x), scale(pad->m_Size.y) );
name[ sizeof(name)-1 ] = 0; name[ sizeof(name)-1 ] = 0;
// @todo verify that all pad names are unique, there is a chance that // @todo verify that all pad names are unique, there is a chance that
@ -574,20 +596,16 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
{ {
double radius = dy; double radius = dy;
for( int layer=0; layer<reportedLayers; ++layer ) for( int ndx=0; ndx<reportedLayers; ++ndx )
{ {
if( doLayer[layer] ) SHAPE* shape;
{ PATH* path;
SHAPE* shape; // see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408
PATH* path; shape = new SHAPE( padstack );
// see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408 padstack->Append( shape );
shape = new SHAPE( padstack ); path = makePath( POINT(-dr, 0.0), POINT(dr, 0.0), layerName[ndx] );
padstack->Append( shape ); shape->SetShape( path );
path = makePath( POINT(-dr, 0.0), POINT(dr, 0.0), layerName ); path->aperture_width = 2.0 * radius;
shape->SetShape( path );
path->aperture_width = 2.0 * radius;
++coppers;
}
} }
} }
else // oval is vertical else // oval is vertical
@ -596,25 +614,21 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
dr = -dr; dr = -dr;
for( int layer=0; layer<reportedLayers; ++layer ) for( int ndx=0; ndx<reportedLayers; ++ndx )
{ {
if( doLayer[layer] ) SHAPE* shape;
{ PATH* path;
SHAPE* shape; // see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408
PATH* path; shape = new SHAPE( padstack );
// see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408 padstack->Append( shape );
shape = new SHAPE( padstack ); path = makePath( POINT(0.0, -dr), POINT(0.0, dr), layerName[ndx] );
padstack->Append( shape ); shape->SetShape( path );
path = makePath( POINT(0.0, -dr), POINT(0.0, dr), layerName ); path->aperture_width = 2.0 * radius;
shape->SetShape( path );
path->aperture_width = 2.0 * radius;
++coppers;
}
} }
} }
snprintf( name, sizeof(name), "Oval%dPad_%.6gx%.6g_mil", snprintf( name, sizeof(name), "Oval%sPad_%.6gx%.6g_mil",
coppers, scale(pad->m_Size.x), scale(pad->m_Size.y) ); uniqifier.c_str(), scale(pad->m_Size.x), scale(pad->m_Size.y) );
name[ sizeof(name)-1 ] = 0; name[ sizeof(name)-1 ] = 0;
// @todo verify that all pad names are unique, there is a chance that // @todo verify that all pad names are unique, there is a chance that