Commit f3fcfce6 authored by dickelbeck's avatar dickelbeck
Browse files

specctra work

parent 74d373e6
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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>
+4 −0
Original line number Original line Diff line number Diff line
@@ -837,6 +837,10 @@ public:
};
};




/**
 * Class VIA
 * corresponds to the &lt;via_descriptor&gt; in the specctra dsn spec.
 */
class VIA : public ELEM
class VIA : public ELEM
{
{
    friend class SPECCTRA_DB;
    friend class SPECCTRA_DB;
+119 −81
Original line number Original line Diff line number Diff line
@@ -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.
}
}




@@ -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;
}
}


@@ -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.
 */ 
 */ 
@@ -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 };
@@ -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;
@@ -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
    }


    
    
}
}