more amazing free software

This commit is contained in:
dickelbeck 2008-02-05 02:13:16 +00:00
parent 68e942b2f4
commit 57c1927121
5 changed files with 79 additions and 332 deletions

View File

@ -5,6 +5,14 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-Feb-4 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
specctra_export.cpp now supports blind/buried/microvias. Changed (fixed?) how
modules are displayed on back of board. Needs testing with various angles
of rotation.
2008-Feb-3 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew

View File

@ -263,7 +263,7 @@ void WinEDA_BasePcbFrame::ProcessItemSelection( wxCommandEvent& event )
BOARD_ITEM* item = (*m_Collector)[itemNdx];
DrawPanel->m_AbortRequest = false;
#if defined (DEBUG) && 0
#if 0 && defined (DEBUG)
item->Show( 0, std::cout );
#endif
@ -282,7 +282,7 @@ void WinEDA_BasePcbFrame::SetCurItem( BOARD_ITEM* aItem )
{
aItem->Display_Infos( this );
#if defined(DEBUG)
#if 0 && defined(DEBUG)
aItem->Show( 0, std::cout );
#endif
@ -294,7 +294,7 @@ void WinEDA_BasePcbFrame::SetCurItem( BOARD_ITEM* aItem )
//MsgPanel->EraseMsgBox();
m_Pcb->Display_Infos( this ); // show the BOARD stuff
#if defined(DEBUG)
#if 0 && defined(DEBUG)
std::cout << "SetCurItem(NULL)\n";
#endif

View File

@ -345,154 +345,6 @@ void MODULE::DrawEdgesOnly( WinEDA_DrawPanel* panel, wxDC* DC,
}
#if 0
/*************************************/
int MODULE::WriteDescr( FILE* File )
/*************************************/
/* Sauvegarde de la description d'un MODULE
*/
{
char StringStat[20];
TEXTE_MODULE* PtText;
EDGE_MODULE* PtEdge;
D_PAD* ptpad;
EDA_BaseStruct* PtStruct;
int ii, NbLigne = 0;
wxString msg;
if( GetState( DELETED ) )
return NbLigne;
/* Generation du fichier module: */
fprintf( File, "$MODULE %s\n", CONV_TO_UTF8( m_LibRef ) );
NbLigne++;
/* Generation des coord et caracteristiques */
memset( StringStat, 0, sizeof(StringStat) );
if( IsLocked() )
StringStat[0] = 'F';
else
StringStat[0] = '~';
if( m_ModuleStatus & MODULE_is_PLACED )
StringStat[1] = 'P';
else
StringStat[1] = '~';
fprintf( File, "Po %d %d %d %d %8.8lX %8.8lX %s\n",
m_Pos.x, m_Pos.y,
m_Orient, m_Layer, m_LastEdit_Time,
m_TimeStamp, StringStat );
NbLigne++;
fprintf( File, "Li %s\n", CONV_TO_UTF8( m_LibRef ) );
NbLigne++;
if( !m_Doc.IsEmpty() )
{
fprintf( File, "Cd %s\n", CONV_TO_UTF8( m_Doc ) );
NbLigne++;
}
if( !m_KeyWord.IsEmpty() )
{
fprintf( File, "Kw %s\n", CONV_TO_UTF8( m_KeyWord ) );
NbLigne++;
}
fprintf( File, "Sc %8.8lX\n", m_TimeStamp );
NbLigne++;
fprintf( File, "Op %X %X 0\n", m_CntRot90, m_CntRot180 );
NbLigne++;
/* Attributs du module */
if( m_Attributs != MOD_DEFAULT )
{
fprintf( File, "At " );
if( m_Attributs & MOD_CMS )
fprintf( File, "SMD " );
if( m_Attributs & MOD_VIRTUAL )
fprintf( File, "VIRTUAL " );
fprintf( File, "\n" );
}
/* Texte Reference du module */
fprintf( File, "T%d %d %d %d %d %d %d %c %c %d \"%.16s\"\n",
m_Reference->m_Type,
m_Reference->m_Pos0.x, m_Reference->m_Pos0.y,
m_Reference->m_Size.y, m_Reference->m_Size.x,
m_Reference->m_Orient + m_Orient, m_Reference->m_Width,
m_Reference->m_Miroir ? 'N' : 'M', m_Reference->m_NoShow ? 'I' : 'V',
m_Reference->GetLayer(),
CONV_TO_UTF8( m_Reference->m_Text ) );
NbLigne++;
/* Texte Value du module */
fprintf( File, "T%d %d %d %d %d %d %d %c %c %d \"%.16s\"\n",
m_Value->m_Type,
m_Value->m_Pos0.x, m_Value->m_Pos0.y,
m_Value->m_Size.y, m_Value->m_Size.x,
m_Value->m_Orient + m_Orient, m_Value->m_Width,
m_Value->m_Miroir ? 'N' : 'M', m_Value->m_NoShow ? 'I' : 'V',
m_Value->GetLayer(),
CONV_TO_UTF8( m_Value->m_Text ) );
NbLigne++;
/* Generation des elements Drawing modules */
PtStruct = m_Drawings;
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
{
switch( PtStruct->Type() )
{
case TYPETEXTEMODULE:
PtText = ( (TEXTE_MODULE*) PtStruct );
fprintf( File, "T%d %d %d %d %d %d %d %c %c %d \"%s\"\n",
PtText->m_Type,
PtText->m_Pos0.x, PtText->m_Pos0.y,
PtText->m_Size.y, PtText->m_Size.x,
PtText->m_Orient + m_Orient, PtText->m_Width,
PtText->m_Miroir ? 'N' : 'M',
PtText->m_NoShow ? 'I' : 'V',
PtText->GetLayer(), CONV_TO_UTF8( PtText->m_Text ) );
NbLigne++;
break;
case TYPEEDGEMODULE:
PtEdge = (EDGE_MODULE*) PtStruct;
PtEdge->WriteDescr( File );
break;
default:
msg.Printf( wxT( "Type (%d) Draw Module inconnu" ),
PtStruct->Type() );
DisplayError( NULL, msg );
break;
}
/* Fin switch gestion des Items draw */
}
/* Generation de la liste des pads */
ptpad = m_Pads;
for( ; ptpad != NULL; ptpad = (D_PAD*) ptpad->Pnext )
{
ii = ptpad->WriteDescr( File );
NbLigne += ii;
}
/* Generation des informations de trac<61>3D */
Write_3D_Descr( File );
/* Fin de description: */
fprintf( File, "$EndMODULE %s\n", CONV_TO_UTF8( m_LibRef ) );
NbLigne++;
return NbLigne;
}
#endif
bool MODULE::Save( FILE* aFile ) const
{
char statusTxt[8];

View File

@ -3480,7 +3480,6 @@ PCB* SPECCTRA_DB::MakePCB()
pcb->structure->rules = new RULE( pcb->structure, T_rule );
pcb->placement = new PLACEMENT( pcb );
//pcb->placement->flip_style = T_mirror_first;
pcb->library = new LIBRARY( pcb );

View File

@ -282,26 +282,6 @@ static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr )
}
/*
static int Track_list_Sort_by_Netcode( const void* o1, const void* o2 )
{
TRACK* t1 = *(TRACK**) o1;
TRACK* t2 = *(TRACK**) o2;
int diff;
if( (diff = t1->GetNet() - t2->GetNet()) )
return diff;
if( (diff = t1->m_Width - t2->m_Width) )
return diff;
if( (diff = t1->GetLayer() - t2->GetLayer()) )
return diff;
return diff; // zero here
}
*/
/**
* Function makePath
* creates a PATH element with a single straight line, a pair of vertices.
@ -317,21 +297,6 @@ static PATH* makePath( const POINT& aStart, const POINT& aEnd, const std::string
}
/*
static QARC* makeArc( const POINT& aStart, const POINT& aEnd,
const POINT& aCenter, const std::string& aLayerName )
{
QARC* qarc = new QARC(0);
qarc->SetStart( aStart );
qarc->SetEnd( aEnd );
qarc->SetCenter( aCenter );
qarc->SetLayerId( aLayerName.c_str() );
return qarc;
}
*/
IMAGE* SPECCTRA_DB::makeIMAGE( MODULE* aModule )
{
PADSTACKS& padstacks = pcb->library->padstacks;
@ -391,25 +356,61 @@ IMAGE* SPECCTRA_DB::makeIMAGE( MODULE* aModule )
PADSTACK* SPECCTRA_DB::makeVia( const SEGVIA* aVia )
{
CIRCLE* circle;
SHAPE* shape;
double dsnDiameter;
char name[48];
PADSTACK* padstack = new PADSTACK( pcb->library );
SHAPE* shape = new SHAPE( padstack );
padstack->Append( shape );
switch( aVia->Shape() )
{
case VIA_THROUGH:
shape = new SHAPE( padstack );
padstack->Append( shape );
// @todo: handle the aVia->Shape() differently for each type of via: MICROVIA, etc.
circle = new CIRCLE( shape );
shape->SetShape( circle );
CIRCLE* circle = new CIRCLE( shape );
shape->SetShape( circle );
double dsnDiameter = scale( aVia->m_Width );
circle->SetDiameter( dsnDiameter );
circle->SetLayerId( "signal" );
dsnDiameter = scale( aVia->m_Width );
circle->SetDiameter( dsnDiameter );
snprintf( name, sizeof(name), "Via_%.6g_mil", dsnDiameter );
name[ sizeof(name)-1 ] = 0;
padstack->SetPadstackId( name );
circle->SetLayerId( "signal" );
snprintf( name, sizeof(name), "Via_%.6g_mil", dsnDiameter );
name[ sizeof(name)-1 ] = 0;
padstack->SetPadstackId( name );
break;
case VIA_BLIND_BURIED:
case VIA_MICROVIA:
int topLayer;
int botLayer;
aVia->ReturnLayerPair( &topLayer, &botLayer );
topLayer = kicadLayer2pcb[topLayer];
botLayer = kicadLayer2pcb[botLayer];
if( topLayer > botLayer )
EXCHG( topLayer, botLayer );
dsnDiameter = scale( aVia->m_Width );
for( int layer=topLayer; layer<=botLayer; ++layer )
{
shape = new SHAPE( padstack );
padstack->Append( shape );
circle = new CIRCLE( shape );
shape->SetShape( circle );
circle->SetDiameter( dsnDiameter );
circle->SetLayerId( layerIds[layer].c_str() );
}
snprintf( name, sizeof(name), "Via[%d-%d]_%.6g_mil", topLayer, botLayer, dsnDiameter );
name[ sizeof(name)-1 ] = 0;
padstack->SetPadstackId( name );
break;
}
return padstack;
}
@ -586,70 +587,12 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
{
SHAPE* shape;
PATH* path;
#if 0
// each oval is 2 lines and 4 (quarter circle) qarcs
QARC* qarc;
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath(
POINT( -dr, -radius ), // aStart
POINT( dr, -radius ), // aEnd
layerName );
shape->SetShape( path );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( dr, -radius), // aStart
POINT( dr, 0.0 ), // aEnd
POINT( dr, 0.0 ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( dr, 0.0), // aStart
POINT( dr, radius), // aEnd
POINT( dr, 0.0 ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath(
POINT( dr, radius ), // aStart
POINT( -dr, radius ), // aEnd
layerName );
shape->SetShape( path );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( -dr, radius), // aStart
POINT( -dr, 0.0), // aEnd
POINT( -dr, 0.0 ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( -dr, 0.0), // aStart
POINT( -dr, -radius), // aEnd
POINT( -dr, 0.0 ), // aCenter
layerName );
shape->SetShape( qarc );
#else
// see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath( POINT(-dr, 0.0), POINT(dr, 0.0), layerName );
shape->SetShape( path );
path->aperture_width = 2.0 * radius;
#endif
++coppers;
}
}
@ -666,70 +609,12 @@ void SPECCTRA_DB::makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads )
{
SHAPE* shape;
PATH* path;
#if 0
// each oval is 2 lines and 2 qarcs
QARC* qarc;
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath(
POINT( -radius, -dr ), // aStart
POINT( -radius, dr ), // aEnd
layerName );
shape->SetShape( path );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( -radius, dr ), // aStart
POINT( 0.0, dy ), // aEnd
POINT( 0.0, dr ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( 0.0, dy ), // aStart
POINT( radius, dr), // aEnd
POINT( 0.0, dr ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath(
POINT( radius, dr ), // aStart
POINT( radius, -dr ), // aEnd
layerName );
shape->SetShape( path );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( radius, -dr ), // aStart
POINT( 0.0, -dy ), // aEnd
POINT( 0.0, -dr ), // aCenter
layerName );
shape->SetShape( qarc );
shape = new SHAPE( padstack );
padstack->Append( shape );
qarc = makeArc(
POINT( 0.0, -dy ), // aStart
POINT( -radius, -dr ), // aEnd
POINT( 0.0, -dr ), // aCenter
layerName );
shape->SetShape( qarc );
#else
// see http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408
shape = new SHAPE( padstack );
padstack->Append( shape );
path = makePath( POINT(0.0, -dr), POINT(0.0, dr), layerName );
shape->SetShape( path );
path->aperture_width = 2.0 * radius;
#endif
++coppers;
}
}
@ -811,6 +696,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
}
}
//pcb->placement->flip_style = T_rotate_first;
// Since none of these statements cause any immediate output, the order
// of them is somewhat flexible. The outputting to disk is done at the
@ -844,6 +730,13 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
layer->name = layerIds.back();
layer->properties.push_back( PROPERTY() );
PROPERTY* property = &layer->properties.back();
property->name = "index";
char temp[32];
sprintf( temp, "%d", pcbNdx );
property->value = temp;
// layer->type = @todo need this, the export would be better.
}
}
@ -914,7 +807,6 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
}
else
{
#if 1
PATH* path = new PATH( boundary );
boundary->paths.push_back( path );
@ -925,17 +817,6 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
// otherwise it will.
path->points.push_back( ppairs[i].start );
}
#else
for( unsigned i=0; i<ppairs.size(); ++i )
{
PATH* path = new PATH( boundary );
boundary->paths.push_back( path );
path->layer_id = "pcb";
path->points.push_back( ppairs[i].start );
path->points.push_back( ppairs[i].end );
}
#endif
}
pcb->structure->SetBOUNDARY( boundary );
@ -1090,8 +971,16 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
place->part_number = CONV_TO_UTF8( module->GetValue() );
// module is flipped from bottom side, set side to T_back
if( module->flag )
if( module->flag )
{
int angle = 1800 - module->m_Orient;
NORMALIZE_ANGLE_POS(angle);
place->SetRotation( angle/10.0 );
place->side = T_back;
}
}
}
@ -1200,7 +1089,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
wiring->wires.push_back( wire );
wire->net_id = netname;
wire->wire_type = T_protect; // @todo, this should be configurable
wire->wire_type = T_normal; // @todo, this should be configurable
int kiLayer = track->GetLayer();
int pcbLayer = kicadLayer2pcb[kiLayer];
@ -1251,7 +1140,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
dsnVia->net_id = CONV_TO_UTF8( equipot->m_Netname );
dsnVia->via_type = T_protect; // @todo, this should be configurable
dsnVia->via_type = T_normal; // @todo, this should be configurable
}
}
@ -1291,4 +1180,3 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard )
} // namespace DSN