diff --git a/common/footprint_info.cpp b/common/footprint_info.cpp index 5c37788a31..c1af32ee0d 100644 --- a/common/footprint_info.cpp +++ b/common/footprint_info.cpp @@ -72,6 +72,9 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( wxArrayString& aFootprintsLibNames ) } } + wxLogDebug( wxT( "Path <%s> -> <%s>." ), GetChars( aFootprintsLibNames[ii] ), + GetChars( filename.GetFullPath() ) ); + if( !filename.FileExists() ) { m_filesNotFound << filename.GetFullName() << wxT( "\n" ); diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp index e812b627ec..a467b328f1 100644 --- a/pcbnew/dialogs/dialog_SVG_print.cpp +++ b/pcbnew/dialogs/dialog_SVG_print.cpp @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include @@ -49,7 +51,7 @@ #define PLOTSVGPAGESIZEOPT_KEY wxT( "PlotSVGPageOpt" ) #define PLOTSVGPLOT_BRD_EDGE_KEY wxT( "PlotSVGBrdEdge" ) -// reasonnable values for default pen width +// reasonable values for default pen width #define WIDTH_MAX_VALUE (2 * IU_PER_MM) #define WIDTH_MIN_VALUE (0.05 * IU_PER_MM) @@ -164,6 +166,7 @@ void DIALOG_SVG_PRINT::initDialog() } } + void DIALOG_SVG_PRINT::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) { // Build the absolute path of current output plot directory @@ -192,8 +195,7 @@ void DIALOG_SVG_PRINT::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) wxString boardFilePath = ( (wxFileName) m_board->GetFileName() ).GetPath(); if( !dirName.MakeRelativeTo( boardFilePath ) ) - wxMessageBox( _( - "Cannot make path relative (target volume different from board file volume)!" ), + wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ), _( "Plot Output Directory" ), wxOK | wxICON_ERROR ); } @@ -201,6 +203,7 @@ void DIALOG_SVG_PRINT::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) m_outputDirectory = m_outputDirectoryName->GetValue(); } + void DIALOG_SVG_PRINT::SetPenWidth() { int pensize = ReturnValueFromTextCtrl( *m_DialogDefaultPenSize ); @@ -219,6 +222,7 @@ void DIALOG_SVG_PRINT::SetPenWidth() m_DialogDefaultPenSize->SetValue( ReturnStringFromValue( g_UserUnit, pensize ) ); } + void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) { m_outputDirectory = m_outputDirectoryName->GetValue(); @@ -227,9 +231,16 @@ void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) // absolute form). Bail if it fails wxFileName outputDir = wxFileName::DirName( m_outputDirectory ); wxString boardFilename = m_board->GetFileName(); + WX_TEXT_CTRL_REPORTER reporter( m_messagesBox ); - if( !EnsureOutputDirectory( &outputDir, boardFilename, m_messagesBox ) ) + if( !EnsureOutputDirectory( &outputDir, boardFilename, &reporter ) ) + { + wxString msg; + msg.Printf( _( "Could not write plot files to folder \"%s\"." ), + GetChars( outputDir.GetPath() ) ); + DisplayError( this, msg ); return; + } m_printMirror = m_printMirrorOpt->GetValue(); m_printBW = m_ModeColorOption->GetSelection(); @@ -245,9 +256,11 @@ void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) } wxString msg; + for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer ) { LAYER_MSK currlayer_mask = GetLayerMask( layer ); + if( (printMaskLayer & currlayer_mask ) == 0 ) continue; @@ -257,7 +270,7 @@ void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) { m_printMaskLayer = printMaskLayer; suffix = wxT( "-brd" ); - } + } else { m_printMaskLayer = currlayer_mask; @@ -320,8 +333,8 @@ bool DIALOG_SVG_PRINT::CreateSVGFile( const wxString& aFullFileName ) LOCALE_IO toggle; SVG_PLOTTER* plotter = (SVG_PLOTTER*) StartPlotBoard( m_board, - &m_plotOpts, aFullFileName, - wxEmptyString ); + &m_plotOpts, aFullFileName, + wxEmptyString ); if( plotter ) { @@ -387,6 +400,5 @@ void DIALOG_SVG_PRINT::OnCloseWindow( wxCloseEvent& event ) m_parent->OnModify(); } - EndModal( 0 ); } diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp index a632c5a3d2..401eed6065 100644 --- a/pcbnew/dialogs/dialog_plot.cpp +++ b/pcbnew/dialogs/dialog_plot.cpp @@ -31,14 +31,13 @@ #include #include #include +#include +#include + #include -#include #include #include -/** - * Class DIALOG_PLOT - */ DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aParent ) : DIALOG_PLOT_BASE( aParent ), m_parent( aParent ), @@ -102,7 +101,6 @@ void DIALOG_PLOT::Init_Dialog() msg = ReturnStringFromValue( g_UserUnit, m_brdSettings.m_SolderMaskMinWidth, true ); m_SolderMaskMinWidthCurrValue->SetLabel( msg ); - // Set units and value for HPGL pen size (this param in in mils). AddUnitSymbol( *m_textPenSize, g_UserUnit ); msg = ReturnStringFromValue( g_UserUnit, @@ -163,7 +161,7 @@ void DIALOG_PLOT::Init_Dialog() m_layerList.push_back( layer ); checkIndex = m_layerCheckListBox->Append( m_board->GetLayerName( layer ) ); - if( m_plotOpts.GetLayerSelection() & GetLayerMask( layer ) ) + if( m_plotOpts.GetLayerSelection() & GetLayerMask( layer ) ) m_layerCheckListBox->Check( checkIndex ); } @@ -224,12 +222,14 @@ void DIALOG_PLOT::OnClose( wxCloseEvent& event ) EndModal( 0 ); } + // A helper function to show a popup menu, when the dialog is right clicked. void DIALOG_PLOT::OnRightClick( wxMouseEvent& event ) { PopupMenu( m_popMenu ); } + // Select or deselect groups of layers in the layers list: #include void DIALOG_PLOT::OnPopUpLayers( wxCommandEvent& event ) @@ -283,6 +283,7 @@ void DIALOG_PLOT::OnPopUpLayers( wxCommandEvent& event ) } } + void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event ) { m_parent->InstallDrillFrame( event ); @@ -329,8 +330,7 @@ void DIALOG_PLOT::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName() ).GetPath(); if( !dirName.MakeRelativeTo( boardFilePath ) ) - wxMessageBox( _( - "Cannot make path relative (target volume different from board file volume)!" ), + wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ), _( "Plot Output Directory" ), wxOK | wxICON_ERROR ); } @@ -354,6 +354,7 @@ PlotFormat DIALOG_PLOT::GetPlotFormat() return plotFmt[ m_plotFormatOpt->GetSelection() ]; } + // Enable or disable widgets according to the plot format selected // and clear also some optional values void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event ) @@ -533,6 +534,8 @@ static bool setDouble( double* aResult, double aValue, double aMin, double aMax *aResult = aValue; return true; } + + static bool setInt( int* aResult, int aValue, int aMin, int aMax ) { if( aValue < aMin ) @@ -691,3 +694,126 @@ void DIALOG_PLOT::applyPlotSettings() m_parent->OnModify(); } } + + +void DIALOG_PLOT::Plot( wxCommandEvent& event ) +{ + applyPlotSettings(); + + // Create output directory if it does not exist (also transform it in + // absolute form). Bail if it fails + wxFileName outputDir = wxFileName::DirName( m_plotOpts.GetOutputDirectory() ); + wxString boardFilename = m_parent->GetBoard()->GetFileName(); + WX_TEXT_CTRL_REPORTER reporter( m_messagesBox ); + + if( !EnsureOutputDirectory( &outputDir, boardFilename, &reporter ) ) + { + wxString msg; + msg.Printf( _( "Could not write plot files to folder \"%s\"." ), + GetChars( outputDir.GetPath() ) ); + DisplayError( this, msg ); + return; + } + + m_plotOpts.SetAutoScale( false ); + m_plotOpts.SetScale( 1 ); + + switch( m_plotOpts.GetScaleSelection() ) + { + default: + break; + + case 0: // Autoscale option + m_plotOpts.SetAutoScale( true ); + break; + + case 2: // 3:2 option + m_plotOpts.SetScale( 1.5 ); + break; + + case 3: // 2:1 option + m_plotOpts.SetScale( 2 ); + break; + + case 4: // 3:1 option + m_plotOpts.SetScale( 3 ); + break; + } + + /* If the scale factor edit controls are disabled or the scale value + * is 0, don't adjust the base scale factor. This fixes a bug when + * the default scale adjust is initialized to 0 and saved in program + * settings resulting in a divide by zero fault. + */ + if( m_fineAdjustXscaleOpt->IsEnabled() && m_XScaleAdjust != 0.0 ) + m_plotOpts.SetFineScaleAdjustX( m_XScaleAdjust ); + + if( m_fineAdjustYscaleOpt->IsEnabled() && m_YScaleAdjust != 0.0 ) + m_plotOpts.SetFineScaleAdjustY( m_YScaleAdjust ); + + if( m_PSFineAdjustWidthOpt->IsEnabled() ) + m_plotOpts.SetWidthAdjust( m_PSWidthAdjust ); + + wxString file_ext( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) ); + + // Test for a reasonable scale value + // XXX could this actually happen? isn't it constrained in the apply + // function? + if( m_plotOpts.GetScale() < PLOT_MIN_SCALE ) + DisplayInfoMessage( this, + _( "Warning: Scale option set to a very small value" ) ); + + if( m_plotOpts.GetScale() > PLOT_MAX_SCALE ) + DisplayInfoMessage( this, + _( "Warning: Scale option set to a very large value" ) ); + + // Save the current plot options in the board + m_parent->SetPlotSettings( m_plotOpts ); + + for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer ) + { + if( m_plotOpts.GetLayerSelection() & GetLayerMask( layer ) ) + { + // Pick the basename from the board file + wxFileName fn( boardFilename ); + + // Use Gerber Extensions based on layer number + // (See http://en.wikipedia.org/wiki/Gerber_File) + if( ( m_plotOpts.GetFormat() == PLOT_FORMAT_GERBER ) + && m_useGerberExtensions->GetValue() ) + file_ext = GetGerberExtension( layer ); + + // Create file name (from the English layer name for non copper layers). + BuildPlotFileName( &fn, outputDir.GetPath(), + m_board->GetStandardLayerName( layer ), + file_ext ); + + LOCALE_IO toggle; + BOARD *board = m_parent->GetBoard(); + PLOTTER *plotter = StartPlotBoard(board, &m_plotOpts, + fn.GetFullPath(), + wxEmptyString ); + + // Print diags in messages box: + wxString msg; + if( plotter ) + { + PlotOneBoardLayer( board, plotter, layer, m_plotOpts ); + plotter->EndPlot(); + delete plotter; + + msg.Printf( _( "Plot file <%s> created" ), GetChars( fn.GetFullPath() ) ); + } + else + msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); + + msg << wxT( "\n" ); + m_messagesBox->AppendText( msg ); + } + } + + // If no layer selected, we have nothing plotted. + // Prompt user if it happens because he could think there is a bug in Pcbnew. + if( !m_plotOpts.GetLayerSelection() ) + DisplayError( this, _( "No layer selected" ) ); +} diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index db8e6f4127..554dde10c5 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #if defined(KICAD_SCRIPTING) || defined(KICAD_SCRIPTING_WXPYTHON) @@ -853,3 +854,9 @@ void PCB_EDIT_FRAME::OnSelectAutoPlaceMode( wxCommandEvent& aEvent ) } } + +void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event ) +{ + DIALOG_PLOT dlg( this ); + dlg.ShowModal(); +} diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index b15b7648c5..849a4b1e29 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -1,7 +1,3 @@ -/** - * @file pcbnew/pcbplot.cpp - */ - /* * This program source code file is part of KiCad, a free EDA CAD application. * @@ -27,6 +23,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +/** + * @file pcbnew/pcbplot.cpp + */ + #include #include #include @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -43,9 +44,7 @@ #include -/** Get the 'traditional' gerber extension depending on the layer -*/ -static wxString GetGerberExtension( LAYER_NUM layer )/*{{{*/ +wxString GetGerberExtension( LAYER_NUM layer ) { switch( layer ) { @@ -107,17 +106,13 @@ static wxString GetGerberExtension( LAYER_NUM layer )/*{{{*/ default: return wxString( wxT( "gbr" ) ); } -}/*}}}*/ +} -/* Complete a plot filename: forces the output directory, - * add a suffix to the name and sets the specified extension - * the suffix is usually the layer name - * replaces not allowed chars in suffix by '_' - */ -void BuildPlotFileName( wxFileName *aFilename, - const wxString& aOutputDir, - const wxString& aSuffix, - const wxString& aExtension ) + +void BuildPlotFileName( wxFileName* aFilename, + const wxString& aOutputDir, + const wxString& aSuffix, + const wxString& aExtension ) { aFilename->SetPath( aOutputDir ); @@ -141,190 +136,73 @@ void BuildPlotFileName( wxFileName *aFilename, aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix ); } -/* - * Fix the output directory pathname to absolute and ensure it exists - * (Creates it if not exists) - */ -bool EnsureOutputDirectory( wxFileName *aOutputDir, + +bool EnsureOutputDirectory( wxFileName* aOutputDir, const wxString& aBoardFilename, - wxTextCtrl* aMessageBox ) + REPORTER* aReporter ) { + wxString msg; wxString boardFilePath = wxFileName( aBoardFilename ).GetPath(); if( !aOutputDir->MakeAbsolute( boardFilePath ) ) { - wxString msg; - msg.Printf( _( "Cannot make <%s> absolute with respect to <%s>!" ), - GetChars( aOutputDir->GetPath() ), - GetChars( boardFilePath ) ); - wxMessageBox( msg, _( "Plot" ), wxOK | wxICON_ERROR ); + if( aReporter ) + { + msg.Printf( _( "*** Error: cannot make path <%s> absolute with respect to <%s>! ***" ), + GetChars( aOutputDir->GetPath() ), + GetChars( boardFilePath ) ); + aReporter->Report( msg ); + } + return false; } wxString outputPath( aOutputDir->GetPath() ); + if( !wxFileName::DirExists( outputPath ) ) { if( wxMkdir( outputPath ) ) { - if( aMessageBox ) + if( aReporter ) { - wxString msg; - msg.Printf( _( "Directory <%s> created.\n" ), GetChars( outputPath ) ); - aMessageBox->AppendText( msg ); + msg.Printf( _( "Output directory <%s> created.\n" ), GetChars( outputPath ) ); + aReporter->Report( msg ); return true; } } else { - if( aMessageBox ) - wxMessageBox( _( "Cannot create output directory!" ), - _( "Plot" ), wxOK | wxICON_ERROR ); + if( aReporter ) + { + msg.Printf( _( "*** Error: cannot create output directory <%s>! ***\n" ), + GetChars( outputPath ) ); + aReporter->Report( msg ); + } + return false; } } + return true; } -/* - * DIALOG_PLOT:Plot - * Actually creates the files - */ -void DIALOG_PLOT::Plot( wxCommandEvent& event ) -{ - applyPlotSettings(); - // Create output directory if it does not exist (also transform it in - // absolute form). Bail if it fails - wxFileName outputDir = wxFileName::DirName( m_plotOpts.GetOutputDirectory() ); - wxString boardFilename = m_parent->GetBoard()->GetFileName(); - if( !EnsureOutputDirectory( &outputDir, boardFilename, m_messagesBox ) ) - return; - - m_plotOpts.SetAutoScale( false ); - m_plotOpts.SetScale( 1 ); - switch( m_plotOpts.GetScaleSelection() ) - { - default: - break; - - case 0: // Autoscale option - m_plotOpts.SetAutoScale( true ); - break; - - case 2: // 3:2 option - m_plotOpts.SetScale( 1.5 ); - break; - - case 3: // 2:1 option - m_plotOpts.SetScale( 2 ); - break; - - case 4: // 3:1 option - m_plotOpts.SetScale( 3 ); - break; - } - - /* If the scale factor edit controls are disabled or the scale value - * is 0, don't adjust the base scale factor. This fixes a bug when - * the default scale adjust is initialized to 0 and saved in program - * settings resulting in a divide by zero fault. - */ - if( m_fineAdjustXscaleOpt->IsEnabled() && m_XScaleAdjust != 0.0 ) - m_plotOpts.SetFineScaleAdjustX( m_XScaleAdjust ); - - if( m_fineAdjustYscaleOpt->IsEnabled() && m_YScaleAdjust != 0.0 ) - m_plotOpts.SetFineScaleAdjustY( m_YScaleAdjust ); - - if( m_PSFineAdjustWidthOpt->IsEnabled() ) - m_plotOpts.SetWidthAdjust( m_PSWidthAdjust ); - - wxString file_ext( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) ); - - // Test for a reasonable scale value - // XXX could this actually happen? isn't it constrained in the apply - // function? - if( m_plotOpts.GetScale() < PLOT_MIN_SCALE ) - DisplayInfoMessage( this, - _( "Warning: Scale option set to a very small value" ) ); - - if( m_plotOpts.GetScale() > PLOT_MAX_SCALE ) - DisplayInfoMessage( this, - _( "Warning: Scale option set to a very large value" ) ); - - // Save the current plot options in the board - m_parent->SetPlotSettings( m_plotOpts ); - - for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer ) - { - if( m_plotOpts.GetLayerSelection() & GetLayerMask( layer ) ) - { - // Pick the basename from the board file - wxFileName fn( boardFilename ); - - // Use Gerber Extensions based on layer number - // (See http://en.wikipedia.org/wiki/Gerber_File) - if( ( m_plotOpts.GetFormat() == PLOT_FORMAT_GERBER ) - && m_useGerberExtensions->GetValue() ) - file_ext = GetGerberExtension( layer ); - - // Create file name (from the English layer name for non copper layers). - BuildPlotFileName( &fn, outputDir.GetPath(), - m_board->GetStandardLayerName( layer ), - file_ext ); - - LOCALE_IO toggle; - BOARD *board = m_parent->GetBoard(); - PLOTTER *plotter = StartPlotBoard(board, &m_plotOpts, - fn.GetFullPath(), - wxEmptyString ); - - // Print diags in messages box: - wxString msg; - if( plotter ) - { - PlotOneBoardLayer( board, plotter, layer, m_plotOpts ); - plotter->EndPlot(); - delete plotter; - - msg.Printf( _( "Plot file <%s> created" ), GetChars( fn.GetFullPath() ) ); - } - else - msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); - - msg << wxT( "\n" ); - m_messagesBox->AppendText( msg ); - } - } - - // If no layer selected, we have nothing plotted. - // Prompt user if it happens because he could think there is a bug in Pcbnew. - if( !m_plotOpts.GetLayerSelection() ) - DisplayError( this, _( "No layer selected" ) ); -} - -void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event ) -{ - DIALOG_PLOT dlg( this ); - dlg.ShowModal(); -} - -/** Batch plotter constructor, nothing interesting here */ PLOT_CONTROLLER::PLOT_CONTROLLER( BOARD *aBoard ) : m_plotter( NULL ), m_board( aBoard ) { } -/** Batch plotter destructor, ensures that the last plot is closed */ + PLOT_CONTROLLER::~PLOT_CONTROLLER() { ClosePlot(); } + /* IMPORTANT THING TO KNOW: the locale during plots *MUST* be kept as * C/POSIX using a LOCALE_IO object on the stack. This even when * opening/closing the plotfile, since some drivers do I/O even then */ -/** Close the current plot, nothing happens if it isn't open */ void PLOT_CONTROLLER::ClosePlot() { LOCALE_IO toggle; @@ -337,10 +215,9 @@ void PLOT_CONTROLLER::ClosePlot() } } -/** Open a new plotfile; works as a factory for plotter objects - */ -bool PLOT_CONTROLLER::OpenPlotfile( const wxString &aSuffix, /*{{{*/ - PlotFormat aFormat, + +bool PLOT_CONTROLLER::OpenPlotfile( const wxString &aSuffix, + PlotFormat aFormat, const wxString &aSheetDesc ) { LOCALE_IO toggle; @@ -358,20 +235,20 @@ bool PLOT_CONTROLLER::OpenPlotfile( const wxString &aSuffix, /*{{{*/ wxString outputDirName = m_plotOpts.GetOutputDirectory() ; wxFileName outputDir = wxFileName::DirName( outputDirName ); wxString boardFilename = m_board->GetFileName(); - if( EnsureOutputDirectory( &outputDir, boardFilename, NULL ) ) + + if( EnsureOutputDirectory( &outputDir, boardFilename ) ) { wxFileName fn( boardFilename ); - BuildPlotFileName( &fn, outputDirName, - aSuffix, GetDefaultPlotExtension( aFormat ) ); + BuildPlotFileName( &fn, outputDirName, aSuffix, GetDefaultPlotExtension( aFormat ) ); - m_plotter = StartPlotBoard( m_board, &m_plotOpts, fn.GetFullPath(), - aSheetDesc ); + m_plotter = StartPlotBoard( m_board, &m_plotOpts, fn.GetFullPath(), aSheetDesc ); } - return( m_plotter != NULL ); -}/*}}}*/ -/** Plot a single layer on the current plotfile */ -bool PLOT_CONTROLLER::PlotLayer( LAYER_NUM aLayer )/*{{{*/ + return( m_plotter != NULL ); +} + + +bool PLOT_CONTROLLER::PlotLayer( LAYER_NUM aLayer ) { LOCALE_IO toggle; @@ -383,7 +260,8 @@ bool PLOT_CONTROLLER::PlotLayer( LAYER_NUM aLayer )/*{{{*/ PlotOneBoardLayer( m_board, m_plotter, aLayer, m_plotOpts ); return true; -}/*}}}*/ +} + void PLOT_CONTROLLER::SetColorMode( bool aColorMode ) { @@ -393,6 +271,7 @@ void PLOT_CONTROLLER::SetColorMode( bool aColorMode ) m_plotter->SetColorMode( aColorMode ); } + bool PLOT_CONTROLLER::GetColorMode() { if( !m_plotter ) @@ -400,4 +279,3 @@ bool PLOT_CONTROLLER::GetColorMode() return m_plotter->GetColorMode(); } - diff --git a/pcbnew/pcbplot.h b/pcbnew/pcbplot.h index 1dc927d101..03f1c5d3e0 100644 --- a/pcbnew/pcbplot.h +++ b/pcbnew/pcbplot.h @@ -44,6 +44,7 @@ class PCB_TARGET; class TEXTE_MODULE; class ZONE_CONTAINER; class BOARD; +class REPORTER; // Shared Config keys for plot and print #define OPTKEY_LAYERBASE wxT( "PlotLayer_%d" ) @@ -218,16 +219,16 @@ void PlotSilkScreen( BOARD* aBoard, PLOTTER* aPlotter, LAYER_MSK aLayerMask, /** * Function EnsureOutputDirectory (helper function) - * Fix the output directory pathname to absolute and ensure it exists - * (Creates it if not exists) - * @param aOutputDir = the wxFileName to modify - * (contains the absolute or relative to the board path - * @param aBoardFilename = the board full filename - * @param aMessageBox = a wxMessageBox to show message (can be NULL) + * make \a OutputDir absolute and creates the path if it doesn't exist. + * @param aOutputDir the wxFileName containing the full path and file name to modify. The path + * may be absolute or relative to \a aBoardFilename . + * @param aBoardFilename the board full path and filename. + * @param aReporter a point to a REPORTER object use to show messages (can be NULL) + * @return true if \a aOutputDir already exists or was successfully created. */ -bool EnsureOutputDirectory( wxFileName* aOutputDir, +bool EnsureOutputDirectory( wxFileName* aOutputDir, const wxString& aBoardFilename, - wxTextCtrl* aMessageBox ); + REPORTER* aReporter = NULL ); /** * Function BuildPlotFileName (helper function) @@ -236,16 +237,24 @@ bool EnsureOutputDirectory( wxFileName* aOutputDir, * the suffix is usually the layer name * replaces not allowed chars in suffix by '_' * @param aFilename = the wxFileName to initialize - * Contians the base filename + * Contains the base filename * @param aOutputDir = the path * @param aSuffix = the suffix to add to the base filename * @param aExtension = the file extension */ -void BuildPlotFileName( wxFileName* aFilename, +void BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir, const wxString& aSuffix, const wxString& aExtension ); + +/** + * Function GetGerberExtension + * @return the appropriate Gerber file extension for \a aLayer + */ +extern wxString GetGerberExtension( LAYER_NUM aLayer ); + + // PLOTGERB.CPP void SelectD_CODE_For_LineDraw( PLOTTER* plotter, int aSize ); diff --git a/pcbnew/plotcontroller.h b/pcbnew/plotcontroller.h index 1716866122..9094188176 100644 --- a/pcbnew/plotcontroller.h +++ b/pcbnew/plotcontroller.h @@ -1,3 +1,27 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2012 Lorenzo Marcantonio, + * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + /** * @file pcbnew/pcbplot.h */ @@ -10,34 +34,46 @@ class PLOTTER; class BOARD; +class REPORTER; -/** + +/** * Batch plotter state object. Keeps the plot options and handles multiple * plot requests */ class PLOT_CONTROLLER { public: + /** Batch plotter constructor, nothing interesting here */ PLOT_CONTROLLER( BOARD *aBoard ); + + /** Batch plotter destructor, ensures that the last plot is closed */ ~PLOT_CONTROLLER(); + PCB_PLOT_PARAMS *AccessPlotOpts() { return &m_plotOpts; } bool IsPlotOpen() const { return m_plotter != NULL; } + + /** Close the current plot, nothing happens if it isn't open */ void ClosePlot(); + + /** Open a new plotfile; works as a factory for plotter objects + */ bool OpenPlotfile( const wxString &aSuffix, PlotFormat aFormat, const wxString &aSheetDesc ); - + + /** Plot a single layer on the current plotfile */ bool PlotLayer( LAYER_NUM layer ); - + void SetColorMode( bool aColorMode ); bool GetColorMode(); private: /// Option bank PCB_PLOT_PARAMS m_plotOpts; - + /// This is the plotter object; it starts NULL and become instantiated - // when a plotfile is requested - PLOTTER *m_plotter; + /// when a plotfile is requested + PLOTTER* m_plotter; /// The board we're plotting BOARD* m_board;