Loading change_log.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,7 @@ email address. * Changed specctra.h's POINT to use double for coordinates. Changed format * Changed specctra.h's POINT to use double for coordinates. Changed format string for Format()ing a double. string for Format()ing a double. * Changed specctra_export.cpp to actually output an incomplete file. * Changed specctra_export.cpp to actually output an incomplete file. * Added BOARD::GetCopperLayerCount() and BOARD::GetLayerName(). 2008-Jan-21 UPDATE Dick Hollenbeck <dick@softplc.com> 2008-Jan-21 UPDATE Dick Hollenbeck <dick@softplc.com> Loading pcbnew/specctra.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -837,6 +837,10 @@ public: }; }; /** * Class VIA * corresponds to the <via_descriptor> in the specctra dsn spec. */ class VIA : public ELEM class VIA : public ELEM { { friend class SPECCTRA_DB; friend class SPECCTRA_DB; Loading pcbnew/specctra_export.cpp +119 −81 Original line number Original line Diff line number Diff line Loading @@ -68,14 +68,17 @@ void WinEDA_PcbFrame::ExportToSPECCTRA( wxCommandEvent& event ) { { db.FromBOARD( m_Pcb ); db.FromBOARD( m_Pcb ); db.ExportPCB( fullFileName, true ); db.ExportPCB( fullFileName, true ); // if an exception is thrown by FromBOARD or Export(), then // ~SPECCTRA_DB() will close the file. } } catch ( IOError ioe ) catch ( IOError ioe ) { { DisplayError( this, ioe.errorText ); DisplayError( this, ioe.errorText ); return; } } // if an exception is thrown by FromBOARD or Export(), then // @todo display a message saying the export is complete. // ~SPECCTRA_DB() will close the file. } } Loading @@ -100,11 +103,17 @@ static inline void swap( POINT_PAIR& pair ) } } /** * Function mapPt * converts a Kicad point into a DSN file point. Kicad's BOARD coordinates * are in deci-mils (i.e. 1/10,000th of an inch) and we are exporting in units * of mils, so we have to divide by 10. */ static POINT mapPt( const wxPoint& pt ) static POINT mapPt( const wxPoint& pt ) { { POINT ret; POINT ret; ret.x = pt.x; ret.x = pt.x / 10.0; ret.y = -pt.y; // make y negative, since it is increasing going down. ret.y = -pt.y /10.0; // make y negative, since it is increasing going down. return ret; return ret; } } Loading Loading @@ -138,7 +147,7 @@ static void swapEnds( POINT_PAIRS& aList ) /** /** * Function isRectangle * Function isRectangle * tests to see if the POINT_PAIRS list make up a vertically/horizontally * tests to see if the POINT_PAIRS list makes up a vertically/horizontally * oriented rectangle. * oriented rectangle. * @return bool - true if there are 4 point pairs making a rectangle. * @return bool - true if there are 4 point pairs making a rectangle. */ */ Loading Loading @@ -177,13 +186,16 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) if( !pcb ) if( !pcb ) pcb = SPECCTRA_DB::MakePCB(); pcb = SPECCTRA_DB::MakePCB(); //-----<header stuff>------------------------------------------------- //-----<unit_descriptor> & <resolution_descriptor>-------------------- { pcb->unit->units = T_mil; pcb->unit->units = T_mil; pcb->resolution->units = T_mil; pcb->resolution->units = T_mil; pcb->resolution->value = 10; pcb->resolution->value = 100; } //-----<board edges>-------------------------------------------------- //-----<boundary_descriptor>------------------------------------------ { // get all the DRAWSEGMENTS into 'items', then look for layer == EDGE_N, // get all the DRAWSEGMENTS into 'items', then look for layer == EDGE_N, // and those segments comprize the board's perimeter. // and those segments comprize the board's perimeter. const KICAD_T scanDRAWSEGMENTS[] = { TYPEDRAWSEGMENT, EOT }; const KICAD_T scanDRAWSEGMENTS[] = { TYPEDRAWSEGMENT, EOT }; Loading Loading @@ -224,8 +236,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) if( isRectangle( ppairs ) ) if( isRectangle( ppairs ) ) { { RECTANGLE* rect = new RECTANGLE( boundary ); RECTANGLE* rect = new RECTANGLE( boundary ); rect->layer_id = "pcb"; rect->layer_id = "pcb"; // opposite corners // opposite corners rect->point0 = ppairs[0].p1; rect->point0 = ppairs[0].p1; rect->point1 = ppairs[2].p1; rect->point1 = ppairs[2].p1; Loading Loading @@ -270,9 +282,35 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) pcb->structure->SetBOUNDARY( boundary ); pcb->structure->SetBOUNDARY( boundary ); } } } //-----<layers>------------------------------------------------------- //-----<layer_descriptor>----------------------------------------------- { // specctra wants top physical layer first, then going down to the // bottom most physical layer in physical sequence. // @question : why does Kicad not display layers in that order? int layerCount = aBoard->GetCopperLayerCount(); for( int ndx=layerCount-1; ndx >= 0; --ndx ) { wxString layerName = aBoard->GetLayerName( ndx>0 && ndx==layerCount-1 ? LAYER_CMP_N : ndx ); LAYER* layer = new LAYER( pcb->structure ); layer->name = CONV_TO_UTF8( layerName ); // layer->type = pcb->structure->layers.push_back( layer ); } } //-----<build the padstack list here, no output>------------------------ //-----<via_descriptor>------------------------------------------------- { // Output the vias in the padstack list here, by name } } } Loading Loading
change_log.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,7 @@ email address. * Changed specctra.h's POINT to use double for coordinates. Changed format * Changed specctra.h's POINT to use double for coordinates. Changed format string for Format()ing a double. string for Format()ing a double. * Changed specctra_export.cpp to actually output an incomplete file. * Changed specctra_export.cpp to actually output an incomplete file. * Added BOARD::GetCopperLayerCount() and BOARD::GetLayerName(). 2008-Jan-21 UPDATE Dick Hollenbeck <dick@softplc.com> 2008-Jan-21 UPDATE Dick Hollenbeck <dick@softplc.com> Loading
pcbnew/specctra.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -837,6 +837,10 @@ public: }; }; /** * Class VIA * corresponds to the <via_descriptor> in the specctra dsn spec. */ class VIA : public ELEM class VIA : public ELEM { { friend class SPECCTRA_DB; friend class SPECCTRA_DB; Loading
pcbnew/specctra_export.cpp +119 −81 Original line number Original line Diff line number Diff line Loading @@ -68,14 +68,17 @@ void WinEDA_PcbFrame::ExportToSPECCTRA( wxCommandEvent& event ) { { db.FromBOARD( m_Pcb ); db.FromBOARD( m_Pcb ); db.ExportPCB( fullFileName, true ); db.ExportPCB( fullFileName, true ); // if an exception is thrown by FromBOARD or Export(), then // ~SPECCTRA_DB() will close the file. } } catch ( IOError ioe ) catch ( IOError ioe ) { { DisplayError( this, ioe.errorText ); DisplayError( this, ioe.errorText ); return; } } // if an exception is thrown by FromBOARD or Export(), then // @todo display a message saying the export is complete. // ~SPECCTRA_DB() will close the file. } } Loading @@ -100,11 +103,17 @@ static inline void swap( POINT_PAIR& pair ) } } /** * Function mapPt * converts a Kicad point into a DSN file point. Kicad's BOARD coordinates * are in deci-mils (i.e. 1/10,000th of an inch) and we are exporting in units * of mils, so we have to divide by 10. */ static POINT mapPt( const wxPoint& pt ) static POINT mapPt( const wxPoint& pt ) { { POINT ret; POINT ret; ret.x = pt.x; ret.x = pt.x / 10.0; ret.y = -pt.y; // make y negative, since it is increasing going down. ret.y = -pt.y /10.0; // make y negative, since it is increasing going down. return ret; return ret; } } Loading Loading @@ -138,7 +147,7 @@ static void swapEnds( POINT_PAIRS& aList ) /** /** * Function isRectangle * Function isRectangle * tests to see if the POINT_PAIRS list make up a vertically/horizontally * tests to see if the POINT_PAIRS list makes up a vertically/horizontally * oriented rectangle. * oriented rectangle. * @return bool - true if there are 4 point pairs making a rectangle. * @return bool - true if there are 4 point pairs making a rectangle. */ */ Loading Loading @@ -177,13 +186,16 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) if( !pcb ) if( !pcb ) pcb = SPECCTRA_DB::MakePCB(); pcb = SPECCTRA_DB::MakePCB(); //-----<header stuff>------------------------------------------------- //-----<unit_descriptor> & <resolution_descriptor>-------------------- { pcb->unit->units = T_mil; pcb->unit->units = T_mil; pcb->resolution->units = T_mil; pcb->resolution->units = T_mil; pcb->resolution->value = 10; pcb->resolution->value = 100; } //-----<board edges>-------------------------------------------------- //-----<boundary_descriptor>------------------------------------------ { // get all the DRAWSEGMENTS into 'items', then look for layer == EDGE_N, // get all the DRAWSEGMENTS into 'items', then look for layer == EDGE_N, // and those segments comprize the board's perimeter. // and those segments comprize the board's perimeter. const KICAD_T scanDRAWSEGMENTS[] = { TYPEDRAWSEGMENT, EOT }; const KICAD_T scanDRAWSEGMENTS[] = { TYPEDRAWSEGMENT, EOT }; Loading Loading @@ -224,8 +236,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) if( isRectangle( ppairs ) ) if( isRectangle( ppairs ) ) { { RECTANGLE* rect = new RECTANGLE( boundary ); RECTANGLE* rect = new RECTANGLE( boundary ); rect->layer_id = "pcb"; rect->layer_id = "pcb"; // opposite corners // opposite corners rect->point0 = ppairs[0].p1; rect->point0 = ppairs[0].p1; rect->point1 = ppairs[2].p1; rect->point1 = ppairs[2].p1; Loading Loading @@ -270,9 +282,35 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError ) pcb->structure->SetBOUNDARY( boundary ); pcb->structure->SetBOUNDARY( boundary ); } } } //-----<layers>------------------------------------------------------- //-----<layer_descriptor>----------------------------------------------- { // specctra wants top physical layer first, then going down to the // bottom most physical layer in physical sequence. // @question : why does Kicad not display layers in that order? int layerCount = aBoard->GetCopperLayerCount(); for( int ndx=layerCount-1; ndx >= 0; --ndx ) { wxString layerName = aBoard->GetLayerName( ndx>0 && ndx==layerCount-1 ? LAYER_CMP_N : ndx ); LAYER* layer = new LAYER( pcb->structure ); layer->name = CONV_TO_UTF8( layerName ); // layer->type = pcb->structure->layers.push_back( layer ); } } //-----<build the padstack list here, no output>------------------------ //-----<via_descriptor>------------------------------------------------- { // Output the vias in the padstack list here, by name } } } Loading