Commit 9e980d91 authored by Dick Hollenbeck's avatar Dick Hollenbeck
Browse files

Add DMils2iu() for scaling deci-mils to internal units.

Instrument saveNETCLASS() with fmtBIU().
Can now round trip to mm board file using LEGACY_PLUGIN in DEBUG build.
parent 149f6d80
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,7 @@ inline int Mm2mils( double x ) { return wxRound( x * 1000./25.4 ); }
/// Convert mils to mm.
/// Convert mils to mm.
inline int Mils2mm( double x ) { return wxRound( x * 25.4 / 1000. ); }
inline int Mils2mm( double x ) { return wxRound( x * 25.4 / 1000. ); }



/// Return whether GOST is in play
/// Return whether GOST is in play
bool IsGOST();
bool IsGOST();


+46 −43
Original line number Original line Diff line number Diff line
@@ -12,6 +12,8 @@


#include <class_track.h>
#include <class_track.h>


#define DEFAULT_BOARD_THICKNESS_DMILS   620



BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() :
BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() :
    m_Pad_Master( 0 )
    m_Pad_Master( 0 )
@@ -33,30 +35,34 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() :
    m_UseConnectedTrackWidth = false;
    m_UseConnectedTrackWidth = false;


    m_MicroViasAllowed = false;                 // true to allow micro vias
    m_MicroViasAllowed = false;                 // true to allow micro vias
    m_DrawSegmentWidth = 100;                   // current graphic line width (not EDGE layer)

    m_EdgeSegmentWidth = 100;                   // current graphic line width (EDGE layer only)
    m_DrawSegmentWidth = DMils2iu( 100 );       // current graphic line width (not EDGE layer)
    m_PcbTextWidth     = 100;                   // current Pcb (not module) Text width

    m_PcbTextSize       = wxSize( 500, 500 );   // current Pcb (not module) Text size
    m_EdgeSegmentWidth = DMils2iu( 100 );       // current graphic line width (EDGE layer only)
    m_TrackMinWidth     = 100;                  // track min value for width ((min copper size value
    m_PcbTextWidth     = DMils2iu( 100 );       // current Pcb (not module) Text width
    m_ViasMinSize       = 350;                  // vias (not micro vias) min diameter

    m_ViasMinDrill      = 200;                  // vias (not micro vias) min drill diameter
    m_PcbTextSize       = wxSize( DMils2iu( 500 ), DMils2iu( 500 ) );
    m_MicroViasMinSize  = 200;                  // micro vias (not vias) min diameter
    // current Pcb (not module) Text size
    m_MicroViasMinDrill = 50;                   // micro vias (not vias) min drill diameter

    m_TrackMinWidth     = DMils2iu( 100 );      // track min value for width ((min copper size value
    m_ViasMinSize       = DMils2iu( 350 );      // vias (not micro vias) min diameter
    m_ViasMinDrill      = DMils2iu( 200 );      // vias (not micro vias) min drill diameter
    m_MicroViasMinSize  = DMils2iu( 200 );      // micro vias (not vias) min diameter
    m_MicroViasMinDrill = DMils2iu( 50 );       // micro vias (not vias) min drill diameter


    // Global mask margins:
    // Global mask margins:
    m_SolderMaskMargin  = 150;                  // Solder mask margin
    m_SolderMaskMargin  = DMils2iu( 150 );      // Solder mask margin
    m_SolderPasteMargin = 0;                    // Solder paste margin absolute value
    m_SolderPasteMargin = 0;                    // Solder paste margin absolute value
    m_SolderPasteMarginRatio = 0.0;             // Solder pask margin ratio value of pad size
    m_SolderPasteMarginRatio = 0.0;             // Solder pask margin ratio value of pad size
                                                // The final margin is the sum of these 2 values
                                                // The final margin is the sum of these 2 values
                                                // Usually < 0 because the mask is smaller than pad
                                                // Usually < 0 because the mask is smaller than pad


    m_ModuleTextSize = wxSize( 500, 500 );
    m_ModuleTextSize = wxSize( DMils2iu( 500 ), DMils2iu( 500 ) );
    m_ModuleTextWidth = 100;
    m_ModuleTextWidth = DMils2iu( 100 );
    m_ModuleSegmentWidth = 100;
    m_ModuleSegmentWidth = DMils2iu( 100 );



    // Layer thickness for 3D viewer
    // Layer thickness for 3D viewer
    m_BoardThickness = (int)(1.6 * PCB_INTERNAL_UNIT / 25.4);
    m_BoardThickness = DMils2iu( DEFAULT_BOARD_THICKNESS_DMILS );
}
}




@@ -64,41 +70,38 @@ void BOARD_DESIGN_SETTINGS::AppendConfigs( PARAM_CFG_ARRAY* aResult )
{
{
    m_Pad_Master.AppendConfigs( aResult );
    m_Pad_Master.AppendConfigs( aResult );


    aResult->push_back( new PARAM_CFG_INT( wxT( "BoardThickness" ),
    aResult->push_back( new PARAM_CFG_INT( wxT( "BoardThickness" ), &m_BoardThickness,
                                                      &m_BoardThickness,
                    DMils2iu( DEFAULT_BOARD_THICKNESS_DMILS ), 0, 0xFFFF ) );
                                                      630, 0, 0xFFFF ) );


    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbV" ),
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbV" ), &m_PcbTextSize.y,
                                                      &m_PcbTextSize.y,
                    DMils2iu( 600 ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
                                                      600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );


    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbH" ),
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtPcbH" ), &m_PcbTextSize.x,
                                                      &m_PcbTextSize.x,
                    DMils2iu( 600 ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
                                                      600, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );


    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModV" ), &m_ModuleTextSize.y,
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModV" ), &m_ModuleTextSize.y,
                                                      500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
                    DMils2iu( 500 ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );

    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModH" ), &m_ModuleTextSize.x,
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModH" ), &m_ModuleTextSize.x,
                                                      500, TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );
                    DMils2iu( 500 ), TEXTS_MIN_SIZE, TEXTS_MAX_SIZE ) );

    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModW" ), &m_ModuleTextWidth,
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtModW" ), &m_ModuleTextWidth,
                                                      100, 1, TEXTS_MAX_WIDTH ) );
                    DMils2iu( 100 ), 1, TEXTS_MAX_WIDTH ) );


    aResult->push_back( new PARAM_CFG_INT( wxT( "VEgarde" ),
    aResult->push_back( new PARAM_CFG_INT( wxT( "VEgarde" ), &m_SolderMaskMargin,
                                                      &m_SolderMaskMargin,
                    DMils2iu( 100 ), 0, DMils2iu( 10000 ) ) );
                                                      100, 0, 10000 ) );


    aResult->push_back( new PARAM_CFG_INT( wxT( "DrawLar" ), &m_DrawSegmentWidth,
    aResult->push_back( new PARAM_CFG_INT( wxT( "DrawLar" ),
                    DMils2iu( 120 ), 0, 0xFFFF ) );
                                                      &m_DrawSegmentWidth,

                                                      120, 0, 0xFFFF ) );
    aResult->push_back( new PARAM_CFG_INT( wxT( "EdgeLar" ), &m_EdgeSegmentWidth,

                    DMils2iu( 120 ), 0, 0xFFFF ) );
    aResult->push_back( new PARAM_CFG_INT( wxT( "EdgeLar" ),

                                                      &m_EdgeSegmentWidth,
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtLar" ),  &m_PcbTextWidth,
                                                      120, 0, 0xFFFF ) );
                    DMils2iu( 120 ), 0, 0xFFFF ) );
    aResult->push_back( new PARAM_CFG_INT( wxT( "TxtLar" ),

                                                      &m_PcbTextWidth,
                                                      120, 0, 0xFFFF ) );
    aResult->push_back( new PARAM_CFG_INT( wxT( "MSegLar" ), &m_ModuleSegmentWidth,
    aResult->push_back( new PARAM_CFG_INT( wxT( "MSegLar" ), &m_ModuleSegmentWidth,
                                                      120, 0, 0xFFFF ) );
                    DMils2iu( 120 ), 0, 0xFFFF ) );
}
}




+4 −4
Original line number Original line Diff line number Diff line
@@ -39,9 +39,9 @@
const wxString NETCLASS::Default = wxT("Default");
const wxString NETCLASS::Default = wxT("Default");


// Initial values for netclass initialization
// Initial values for netclass initialization
int NETCLASS::DEFAULT_CLEARANCE  = 100;         // track to track and track to pads clearance
int NETCLASS::DEFAULT_CLEARANCE  = DMils2iu( 100 );     // track to track and track to pads clearance
int NETCLASS::DEFAULT_VIA_DRILL  = 250;         // default via drill
int NETCLASS::DEFAULT_VIA_DRILL  = DMils2iu( 250 );     // default via drill
int NETCLASS::DEFAULT_UVIA_DRILL = 50;          // micro via drill
int NETCLASS::DEFAULT_UVIA_DRILL = DMils2iu( 50 );      // micro via drill




NETCLASS::NETCLASS( BOARD* aParent, const wxString& aName, const NETCLASS* initialParameters ) :
NETCLASS::NETCLASS( BOARD* aParent, const wxString& aName, const NETCLASS* initialParameters ) :
+8 −12
Original line number Original line Diff line number Diff line
@@ -1502,10 +1502,10 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText )
    if( thickn < 1 )
    if( thickn < 1 )
        thickn = 1;
        thickn = 1;


    /*  this is better left to the save function, or to the accessor, since we will
    /*  this is better left to the dialogs UIs
        be supporting more than one board format.
    aText->SetThickness( Clamp_Text_PenSize( thickn, aText->GetSize() ) );
    aText->SetThickness( Clamp_Text_PenSize( thickn, aText->GetSize() ) );
    */
    */

    aText->SetThickness( thickn );
    aText->SetThickness( thickn );


    aText->SetMirrored( mirror && *mirror == 'M' );
    aText->SetMirrored( mirror && *mirror == 'M' );
@@ -1514,8 +1514,6 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText )


    aText->SetItalic( italic && *italic == 'I' );
    aText->SetItalic( italic && *italic == 'I' );


    // @todo put in accessor?
    // Test for a reasonable layer:
    if( layer < 0 )
    if( layer < 0 )
        layer = 0;
        layer = 0;
    if( layer > LAST_NO_COPPER_LAYER )
    if( layer > LAST_NO_COPPER_LAYER )
@@ -1614,7 +1612,6 @@ void LEGACY_PLUGIN::loadPCB_LINE()
            BIU end_y   = biuParse( data, &data );
            BIU end_y   = biuParse( data, &data );
            BIU width   = biuParse( data );
            BIU width   = biuParse( data );


            // @todo put in accessor?  why 0?
            if( width < 0 )
            if( width < 0 )
                width = 0;
                width = 0;


@@ -1638,7 +1635,6 @@ void LEGACY_PLUGIN::loadPCB_LINE()
                    int layer;
                    int layer;
                    layer = intParse( data );
                    layer = intParse( data );


                    // @todo: put in accessor?
                    if( layer < FIRST_NO_COPPER_LAYER )
                    if( layer < FIRST_NO_COPPER_LAYER )
                        layer = FIRST_NO_COPPER_LAYER;
                        layer = FIRST_NO_COPPER_LAYER;


@@ -3046,14 +3042,14 @@ void LEGACY_PLUGIN::saveNETCLASS( const NETCLASS* nc ) const
    fprintf( m_fp, "Name %s\n", EscapedUTF8( nc->GetName() ).c_str() );
    fprintf( m_fp, "Name %s\n", EscapedUTF8( nc->GetName() ).c_str() );
    fprintf( m_fp, "Desc %s\n", EscapedUTF8( nc->GetDescription() ).c_str() );
    fprintf( m_fp, "Desc %s\n", EscapedUTF8( nc->GetDescription() ).c_str() );


    fprintf( m_fp, "Clearance %d\n",    nc->GetClearance() );
    fprintf( m_fp, "Clearance %s\n",    fmtBIU( nc->GetClearance() ).c_str() );
    fprintf( m_fp, "TrackWidth %d\n",   nc->GetTrackWidth() );
    fprintf( m_fp, "TrackWidth %s\n",   fmtBIU( nc->GetTrackWidth() ).c_str() );


    fprintf( m_fp, "ViaDia %d\n",       nc->GetViaDiameter() );
    fprintf( m_fp, "ViaDia %s\n",       fmtBIU( nc->GetViaDiameter() ).c_str() );
    fprintf( m_fp, "ViaDrill %d\n",     nc->GetViaDrill() );
    fprintf( m_fp, "ViaDrill %s\n",     fmtBIU( nc->GetViaDrill() ).c_str() );


    fprintf( m_fp, "uViaDia %d\n",      nc->GetuViaDiameter() );
    fprintf( m_fp, "uViaDia %s\n",      fmtBIU( nc->GetuViaDiameter() ).c_str() );
    fprintf( m_fp, "uViaDrill %d\n",    nc->GetuViaDrill() );
    fprintf( m_fp, "uViaDrill %s\n",    fmtBIU( nc->GetuViaDrill() ).c_str() );


    for( NETCLASS::const_iterator it = nc->begin();  it!=nc->end();  ++it )
    for( NETCLASS::const_iterator it = nc->begin();  it!=nc->end();  ++it )
        fprintf( m_fp, "AddNet %s\n", EscapedUTF8( *it ).c_str() );
        fprintf( m_fp, "AddNet %s\n", EscapedUTF8( *it ).c_str() );
+18 −3
Original line number Original line Diff line number Diff line
@@ -33,9 +33,24 @@
#define DIM_ANCRE_MODULE 3       /* Anchor size (footprint center) */
#define DIM_ANCRE_MODULE 3       /* Anchor size (footprint center) */
#define DIM_ANCRE_TEXTE  2       /* Anchor size (Text center) */
#define DIM_ANCRE_TEXTE  2       /* Anchor size (Text center) */


#define TEXTS_MIN_SIZE  50       // Minimum text size in Pcbnew units value (50 * 0.0001 mils)

#define TEXTS_MAX_SIZE  10000    // Maximum text size in Pcbnew units value (1 inch) )
#if defined(PCBNEW)
#define TEXTS_MAX_WIDTH 5000     // Maximum text width in Pcbnew units value (0.5 inches)
/// Convert deci-mils to PCBNEW internal units (iu).
inline int DMils2iu( int dmils )
{
#if defined( USE_PCBNEW_NANOMETRES )
    return int( dmils * 25.4e2 + 0.5 );
#else
    return dmils;
#endif
}
#endif


#define TEXTS_MIN_SIZE  DMils2iu( 50 )      ///< Minimum text size in Pcbnew units value (50 * 0.0001 mils)
#define TEXTS_MAX_SIZE  DMils2iu( 10000 )   ///< Maximum text size in Pcbnew units value (1 inch) )
#define TEXTS_MAX_WIDTH DMils2iu( 5000 )    ///< Maximum text width in Pcbnew units value (0.5 inches)



/* Flag to force the SKETCH mode to display items (.m_Flags member) */
/* Flag to force the SKETCH mode to display items (.m_Flags member) */
#define FORCE_SKETCH ( IS_DRAGGED | IN_EDIT )
#define FORCE_SKETCH ( IS_DRAGGED | IN_EDIT )