diff --git a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp index 8cab51a955..16a8fff4a7 100644 --- a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp +++ b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp @@ -359,7 +359,7 @@ bool ExportSpecctraDSN( BOARD* aBoard, wxString& aFullFilename ) { try { - ExportBoardToSpecctraFile( aBoard, aFullFilename ); + DSN::ExportBoardToSpecctraFile( aBoard, aFullFilename ); } catch( ... ) { @@ -399,6 +399,20 @@ bool ImportSpecctraSES( wxString& aFullFilename ) } } +bool ImportSpecctraSES( BOARD* aBoard, wxString& aFullFilename ) +{ + try + { + DSN::ImportSpecctraSession( aBoard, aFullFilename ); + } + catch( ... ) + { + return false; + } + + return true; +} + bool ExportFootprintsToLibrary( bool aStoreInNewLib, const wxString& aLibName, wxString* aLibPath ) { diff --git a/pcbnew/python/scripting/pcbnew_scripting_helpers.h b/pcbnew/python/scripting/pcbnew_scripting_helpers.h index fc02055c97..92fe4d7817 100644 --- a/pcbnew/python/scripting/pcbnew_scripting_helpers.h +++ b/pcbnew/python/scripting/pcbnew_scripting_helpers.h @@ -137,6 +137,17 @@ bool ExportVRML( const wxString& aFullFileName, double aMMtoWRMLunit, bool aExpo */ bool ImportSpecctraSES( wxString& aFullFilename ); +/** + * Import a specctra *.ses file and use it to relocate MODULEs and to replace all vias and + * Unlike first overload doesn't need a valid PCB_EDIT_FRAME set and can be used + * in a standalone python script. + * + * See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification. + * + * @return true if OK + */ +bool ImportSpecctraSES( BOARD* aBoard, wxString& aFullFilename ); + /** * Save footprints in a library: * diff --git a/pcbnew/specctra_import_export/specctra.h b/pcbnew/specctra_import_export/specctra.h index f15ff3298c..69bf8307f5 100644 --- a/pcbnew/specctra_import_export/specctra.h +++ b/pcbnew/specctra_import_export/specctra.h @@ -48,15 +48,6 @@ class SHAPE_POLY_SET; typedef DSN::T DSN_T; -/** - * @brief Helper method to export board to DSN file - * - * @param aBoard board object - * @param aFullFilename specctra file name - */ -void ExportBoardToSpecctraFile( BOARD* aBoard, const wxString& aFullFilename ); - - /** * This source file implements export and import capabilities to the * specctra dsn file format. The grammar for that file format is documented @@ -85,6 +76,14 @@ namespace DSN { class SPECCTRA_DB; +/** + * @brief Helper method to export board to DSN file + * @param aBoard board object + * @param aFullFilename specctra file name + */ +void ExportBoardToSpecctraFile( BOARD* aBoard, const wxString& aFullFilename ); + + /** * The DSN namespace and returns the C string representing a SPECCTRA_DB::keyword. * @@ -4003,6 +4002,14 @@ private: int m_bot_via_layer; }; +/** + * @brief Helper method to import SES file to a board + * + * @param aBoard board object + * @param aFullFilename specctra file name + */ + +bool ImportSpecctraSession( BOARD* aBoard, const wxString& fullFileName ); } // namespace DSN diff --git a/pcbnew/specctra_import_export/specctra_export.cpp b/pcbnew/specctra_import_export/specctra_export.cpp index 7b81499564..763ff03e39 100644 --- a/pcbnew/specctra_import_export/specctra_export.cpp +++ b/pcbnew/specctra_import_export/specctra_export.cpp @@ -79,7 +79,7 @@ bool PCB_EDIT_FRAME::ExportSpecctraFile( const wxString& aFullFilename ) try { - ExportBoardToSpecctraFile( GetBoard(), aFullFilename ); + DSN::ExportBoardToSpecctraFile( GetBoard(), aFullFilename ); } catch( const IO_ERROR& ioe ) { @@ -102,6 +102,9 @@ bool PCB_EDIT_FRAME::ExportSpecctraFile( const wxString& aFullFilename ) return ok; } +namespace DSN +{ + void ExportBoardToSpecctraFile( BOARD* aBoard, const wxString& aFullFilename ) { @@ -138,8 +141,6 @@ void ExportBoardToSpecctraFile( BOARD* aBoard, const wxString& aFullFilename ) } -namespace DSN { - // "specctra reported units" are what we tell the external router that our exported lengths are in /** @@ -1836,4 +1837,4 @@ void SPECCTRA_DB::RevertFOOTPRINTs( BOARD* aBoard ) m_footprintsAreFlipped = false; } -} // namespace DSN +} // namespace DSN diff --git a/pcbnew/specctra_import_export/specctra_import.cpp b/pcbnew/specctra_import_export/specctra_import.cpp index f3d1776963..d454dda816 100644 --- a/pcbnew/specctra_import_export/specctra_import.cpp +++ b/pcbnew/specctra_import_export/specctra_import.cpp @@ -50,28 +50,23 @@ using namespace DSN; - bool PCB_EDIT_FRAME::ImportSpecctraSession( const wxString& fullFileName ) { // To avoid issues with undo/redo lists (dangling pointers) clear the lists // todo: use undo/redo feature ClearUndoRedoList(); - // Remove existing tracks from view. They will be readded later after loading new tracks. if( GetCanvas() ) // clear view: { for( PCB_TRACK* track : GetBoard()->Tracks() ) GetCanvas()->GetView()->Remove( track ); } - SPECCTRA_DB db; - LOCALE_IO toggle; - try { - db.LoadSESSION( fullFileName ); - db.FromSESSION( GetBoard() ); + DSN::ImportSpecctraSession( GetBoard(), fullFileName ); } + catch( const IO_ERROR& ioe ) { wxString msg = _( "Board may be corrupted, do not save it.\n Fix problem and try again" ); @@ -82,20 +77,16 @@ bool PCB_EDIT_FRAME::ImportSpecctraSession( const wxString& fullFileName ) return false; } - GetBoard()->GetConnectivity()->ClearRatsnest(); - GetBoard()->BuildConnectivity(); - OnModify(); if( GetCanvas() ) // Update view: { // Update footprint positions - GetCanvas()->GetView()->RecacheAllItems(); // add imported tracks (previous tracks are removed, therefore all are new) for( auto track : GetBoard()->Tracks() ) GetCanvas()->GetView()->Add( track ); - } + } SetStatusText( wxString( _( "Session file imported and merged OK." ) ) ); @@ -545,4 +536,17 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) } +bool ImportSpecctraSession( BOARD* aBoard, const wxString& fullFileName ) +{ + SPECCTRA_DB db; + LOCALE_IO toggle; + + db.LoadSESSION( fullFileName ); + db.FromSESSION( aBoard ); + + aBoard->GetConnectivity()->ClearRatsnest(); + aBoard->BuildConnectivity(); + + return true; +} } // namespace DSN