Loading change_log.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. 2008-Feb-20 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew specctra_export.cpp fixed the offset problem with freerouter.net. http://tech.groups.yahoo.com/group/kicad-devel/message/1076 2008-Feb-19 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew Loading pcbnew/specctra_export.cpp +59 −57 Original line number Diff line number Diff line Loading @@ -298,17 +298,6 @@ static bool isKeepout( D_PAD* aPad ) } /* static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr ) { const D_PAD* padref = *(D_PAD**)refptr; const D_PAD* padcmp = *(D_PAD**)objptr; return D_PAD::Compare( padref, padcmp ); } */ /** * Function makePath * creates a PATH element with a single straight line, a pair of vertices. Loading @@ -325,13 +314,13 @@ static PATH* makePath( const POINT& aStart, const POINT& aEnd, const std::string /** * Struct wxString_less_than_ * is used the std:set<> and std::map<> instantiations below. * Struct wxString_less_than * is used by the std:set<> and std::map<> instantiations below. * See STRINGSET typedef and PINMAP typedef below. */ struct wxString_less_than { // a "less than" test on two wxStrings, by pointer. // a "less than" test on two wxStrings bool operator()( const wxString& s1, const wxString& s2) const { return s1.Cmp( s2 ) < 0; // case specific wxString compare Loading @@ -356,9 +345,8 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) aPad->IsOnLayer( COPPER_LAYER_N ) }; // caller must do this screen before calling here. // caller must do these checks before calling here. wxASSERT( !isKeepout( aPad ) ); wxASSERT( doLayer[0] || doLayer[1] ); PADSTACK* padstack = new PADSTACK(); Loading @@ -366,6 +354,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) int reportedLayers = 0; // how many in reported padstack const char* layerName[NB_COPPER_LAYERS]; if( aPad->m_Attribut==PAD_SMD || aPad->m_Attribut==PAD_CONN ) { // PAD_SMD and PAD_CONN are reported on each layer for which Loading Loading @@ -400,7 +389,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) */ reportedLayers = 1; layerName[0] = signal; layerName[0] = "signal"; uniqifier = "[A]"; // A for all #else Loading @@ -415,6 +404,23 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) #endif } POINT dsnOffset; if( aPad->m_Offset.x || aPad->m_Offset.y ) { char offsetTxt[32]; wxPoint offset( aPad->m_Offset.x, aPad->m_Offset.y ); dsnOffset = mapPt( offset ); // using '(' or ')' would cause padstack name to be quote wrapped, // so use other brackets, and {} locks freerouter. sprintf( offsetTxt, "[%.6g,%.6g]", dsnOffset.x, dsnOffset.y ); uniqifier += offsetTxt; } switch( aPad->m_PadShape ) { default: Loading @@ -432,11 +438,13 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) circle->SetLayerId( layerName[ndx] ); circle->SetDiameter( diameter ); circle->SetVertex( dsnOffset ); } snprintf( name, sizeof(name), "Round%sPad_%.6g_mil", uniqifier.c_str(), scale(aPad->m_Size.x) ); name[ sizeof(name)-1 ] = 0; padstack->SetPadstackId( name ); } break; Loading @@ -449,6 +457,9 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) POINT lowerLeft( -dx, -dy ); POINT upperRight( dx, dy ); lowerLeft += dsnOffset; upperRight += dsnOffset; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape = new SHAPE( padstack ); Loading @@ -474,29 +485,29 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) double dx = scale( aPad->m_Size.x ) / 2.0; double dy = scale( aPad->m_Size.y ) / 2.0; double dr = dx - dy; double radius; POINT start; POINT stop; if( dr >= 0 ) // oval is horizontal { double radius = dy; radius = dy; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape; PATH* path; // 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[ndx] ); shape->SetShape( path ); path->aperture_width = 2.0 * radius; } start = POINT( -dr, 0.0 ); stop = POINT( dr, 0.0 ); } else // oval is vertical { double radius = dx; radius = dx; dr = -dr; start = POINT( 0.0, -dr ); stop = POINT( 0.0, dr ); } start += dsnOffset; stop += dsnOffset; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape; Loading @@ -504,11 +515,10 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) // 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[ndx] ); path = makePath( start, stop, layerName[ndx] ); shape->SetShape( path ); path->aperture_width = 2.0 * radius; } } snprintf( name, sizeof(name), "Oval%sPad_%.6gx%.6g_mil", uniqifier.c_str(), scale(aPad->m_Size.x), scale(aPad->m_Size.y) ); Loading Loading @@ -596,7 +606,7 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) { pinmap[ padName ] = 0; } else else // pad name is a duplicate within this module { char buf[32]; Loading @@ -613,22 +623,14 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) pin->padstack_id = padstack->padstack_id; wxPoint pos( pad->m_Pos0 ); wxPoint offset( pad->m_Offset.x, pad->m_Offset.y ); int angle = pad->m_Orient - aModule->m_Orient; // tenths of degrees if( angle ) { NORMALIZE_ANGLE_POS(angle); pin->SetRotation( angle / 10.0 ); if( pad->m_Offset.x || pad->m_Offset.y ) { RotatePoint( &offset, angle ); } } pos += offset; wxPoint pos( pad->m_Pos0 ); pin->SetVertex( mapPt( pos ) ); } Loading pcbnew/specctra_import.cpp +8 −7 Original line number Diff line number Diff line Loading @@ -73,12 +73,13 @@ void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event ) fullFileName = EDA_FileSelector( _( "Merge Specctra Session file:" ), path, name, // name.ext without path! name, sessionExt, mask, this, wxFD_OPEN, FALSE ); FALSE ); if( fullFileName == wxEmptyString ) return; Loading Loading
change_log.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. 2008-Feb-20 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew specctra_export.cpp fixed the offset problem with freerouter.net. http://tech.groups.yahoo.com/group/kicad-devel/message/1076 2008-Feb-19 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew Loading
pcbnew/specctra_export.cpp +59 −57 Original line number Diff line number Diff line Loading @@ -298,17 +298,6 @@ static bool isKeepout( D_PAD* aPad ) } /* static int Pad_list_Sort_by_Shapes( const void* refptr, const void* objptr ) { const D_PAD* padref = *(D_PAD**)refptr; const D_PAD* padcmp = *(D_PAD**)objptr; return D_PAD::Compare( padref, padcmp ); } */ /** * Function makePath * creates a PATH element with a single straight line, a pair of vertices. Loading @@ -325,13 +314,13 @@ static PATH* makePath( const POINT& aStart, const POINT& aEnd, const std::string /** * Struct wxString_less_than_ * is used the std:set<> and std::map<> instantiations below. * Struct wxString_less_than * is used by the std:set<> and std::map<> instantiations below. * See STRINGSET typedef and PINMAP typedef below. */ struct wxString_less_than { // a "less than" test on two wxStrings, by pointer. // a "less than" test on two wxStrings bool operator()( const wxString& s1, const wxString& s2) const { return s1.Cmp( s2 ) < 0; // case specific wxString compare Loading @@ -356,9 +345,8 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) aPad->IsOnLayer( COPPER_LAYER_N ) }; // caller must do this screen before calling here. // caller must do these checks before calling here. wxASSERT( !isKeepout( aPad ) ); wxASSERT( doLayer[0] || doLayer[1] ); PADSTACK* padstack = new PADSTACK(); Loading @@ -366,6 +354,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) int reportedLayers = 0; // how many in reported padstack const char* layerName[NB_COPPER_LAYERS]; if( aPad->m_Attribut==PAD_SMD || aPad->m_Attribut==PAD_CONN ) { // PAD_SMD and PAD_CONN are reported on each layer for which Loading Loading @@ -400,7 +389,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) */ reportedLayers = 1; layerName[0] = signal; layerName[0] = "signal"; uniqifier = "[A]"; // A for all #else Loading @@ -415,6 +404,23 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) #endif } POINT dsnOffset; if( aPad->m_Offset.x || aPad->m_Offset.y ) { char offsetTxt[32]; wxPoint offset( aPad->m_Offset.x, aPad->m_Offset.y ); dsnOffset = mapPt( offset ); // using '(' or ')' would cause padstack name to be quote wrapped, // so use other brackets, and {} locks freerouter. sprintf( offsetTxt, "[%.6g,%.6g]", dsnOffset.x, dsnOffset.y ); uniqifier += offsetTxt; } switch( aPad->m_PadShape ) { default: Loading @@ -432,11 +438,13 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) circle->SetLayerId( layerName[ndx] ); circle->SetDiameter( diameter ); circle->SetVertex( dsnOffset ); } snprintf( name, sizeof(name), "Round%sPad_%.6g_mil", uniqifier.c_str(), scale(aPad->m_Size.x) ); name[ sizeof(name)-1 ] = 0; padstack->SetPadstackId( name ); } break; Loading @@ -449,6 +457,9 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) POINT lowerLeft( -dx, -dy ); POINT upperRight( dx, dy ); lowerLeft += dsnOffset; upperRight += dsnOffset; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape = new SHAPE( padstack ); Loading @@ -474,29 +485,29 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) double dx = scale( aPad->m_Size.x ) / 2.0; double dy = scale( aPad->m_Size.y ) / 2.0; double dr = dx - dy; double radius; POINT start; POINT stop; if( dr >= 0 ) // oval is horizontal { double radius = dy; radius = dy; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape; PATH* path; // 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[ndx] ); shape->SetShape( path ); path->aperture_width = 2.0 * radius; } start = POINT( -dr, 0.0 ); stop = POINT( dr, 0.0 ); } else // oval is vertical { double radius = dx; radius = dx; dr = -dr; start = POINT( 0.0, -dr ); stop = POINT( 0.0, dr ); } start += dsnOffset; stop += dsnOffset; for( int ndx=0; ndx<reportedLayers; ++ndx ) { SHAPE* shape; Loading @@ -504,11 +515,10 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad ) // 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[ndx] ); path = makePath( start, stop, layerName[ndx] ); shape->SetShape( path ); path->aperture_width = 2.0 * radius; } } snprintf( name, sizeof(name), "Oval%sPad_%.6gx%.6g_mil", uniqifier.c_str(), scale(aPad->m_Size.x), scale(aPad->m_Size.y) ); Loading Loading @@ -596,7 +606,7 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) { pinmap[ padName ] = 0; } else else // pad name is a duplicate within this module { char buf[32]; Loading @@ -613,22 +623,14 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) pin->padstack_id = padstack->padstack_id; wxPoint pos( pad->m_Pos0 ); wxPoint offset( pad->m_Offset.x, pad->m_Offset.y ); int angle = pad->m_Orient - aModule->m_Orient; // tenths of degrees if( angle ) { NORMALIZE_ANGLE_POS(angle); pin->SetRotation( angle / 10.0 ); if( pad->m_Offset.x || pad->m_Offset.y ) { RotatePoint( &offset, angle ); } } pos += offset; wxPoint pos( pad->m_Pos0 ); pin->SetVertex( mapPt( pos ) ); } Loading
pcbnew/specctra_import.cpp +8 −7 Original line number Diff line number Diff line Loading @@ -73,12 +73,13 @@ void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event ) fullFileName = EDA_FileSelector( _( "Merge Specctra Session file:" ), path, name, // name.ext without path! name, sessionExt, mask, this, wxFD_OPEN, FALSE ); FALSE ); if( fullFileName == wxEmptyString ) return; Loading