diff --git a/3d-viewer/3d_canvas.cpp b/3d-viewer/3d_canvas.cpp index df8ad2e694..c2794485a3 100644 --- a/3d-viewer/3d_canvas.cpp +++ b/3d-viewer/3d_canvas.cpp @@ -586,7 +586,7 @@ void EDA_3D_CANVAS::SetLights() */ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event ) { - wxFileName fn( Parent()->Parent()->GetScreen()->GetFileName() ); + wxFileName fn( Parent()->GetDefaultFileName() ); wxString FullFileName; wxString file_ext, mask; bool fmt_is_jpeg = false; @@ -598,7 +598,7 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event ) { file_ext = fmt_is_jpeg ? wxT( "jpg" ) : wxT( "png" ); mask = wxT( "*." ) + file_ext; - FullFileName = Parent()->Parent()->GetScreen()->GetFileName(); + FullFileName = Parent()->GetDefaultFileName(); fn.SetExt( file_ext ); FullFileName = EDA_FileSelector( _( "3D Image filename:" ), wxEmptyString, diff --git a/3d-viewer/3d_viewer.h b/3d-viewer/3d_viewer.h index 7af89351df..7efa7d6a70 100644 --- a/3d-viewer/3d_viewer.h +++ b/3d-viewer/3d_viewer.h @@ -187,6 +187,7 @@ private: wxSize m_FrameSize; wxAuiManager m_auimgr; bool m_reloadRequest; + wxString m_defaultFileName; /// Filename to propose for screenshot public: EDA_3D_FRAME( PCB_BASE_FRAME* parent, const wxString& title, @@ -216,6 +217,8 @@ public: */ void NewDisplay(); + void SetDefaultFileName(const wxString &aFn) { m_defaultFileName = aFn; } + const wxString &GetDefaultFileName() const { return m_defaultFileName; } private: void Exit3DFrame( wxCommandEvent& event ); void OnCloseWindow( wxCloseEvent& Event ); diff --git a/common/common_plotDXF_functions.cpp b/common/common_plotDXF_functions.cpp index c4eb45e82a..eaa0b1960c 100644 --- a/common/common_plotDXF_functions.cpp +++ b/common/common_plotDXF_functions.cpp @@ -29,15 +29,22 @@ void DXF_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, wxASSERT( !outputFile ); plotOffset = aOffset; plotScale = aScale; - // XXX Need to think about this: what is the 'native' unit used for DXF? + + /* DXF paper is 'virtual' so there is no need of a paper size. + Also this way we can handle the aux origin which can be useful + (for example when aligning to a mechanical drawing) */ + paperSize.x = 0; + paperSize.y = 0; + + /* Like paper size DXF units are abstract too. Anyway there is a + * system variable (MEASUREMENT) which will be set to 1 to indicate + * metric units */ + m_IUsPerDecimil = aIusPerDecimil; iuPerDeviceUnit = 1.0 / aIusPerDecimil; // Gives a DXF in decimils - iuPerDeviceUnit *= 0.00254; // DXF in mm (I like it best) - // Compute the paper size in IUs - paperSize = pageInfo.GetSizeMils(); - paperSize.x *= 10.0 * aIusPerDecimil; - paperSize.y *= 10.0 * aIusPerDecimil; - SetDefaultLineWidth( 0 ); // No line width on DXF - plotMirror = false; // No mirroring on DXF + iuPerDeviceUnit *= 0.00254; // ... now in mm + + SetDefaultLineWidth( 0 ); // No line width on DXF + plotMirror = false; // No mirroring on DXF currentColor = BLACK; } @@ -63,8 +70,12 @@ bool DXF_PLOTTER::StartPlot( FILE* fout ) " 9\n" "$ANGDIR\n" " 70\n" + " 1\n" + " 9\n" + "$MEASUREMENT\n" + " 70\n" "0\n" - " 0\n" + " 0\n" // This means 'metric units' "ENDSEC\n" " 0\n" "SECTION\n" diff --git a/common/common_plotGERBER_functions.cpp b/common/common_plotGERBER_functions.cpp index c5e85fba69..ff3f883574 100644 --- a/common/common_plotGERBER_functions.cpp +++ b/common/common_plotGERBER_functions.cpp @@ -25,6 +25,7 @@ void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, plotOffset = aOffset; wxASSERT( aScale == 1 ); plotScale = 1; + m_IUsPerDecimil = aIusPerDecimil; iuPerDeviceUnit = 1.0 / aIusPerDecimil; /* We don't handle the filmbox, and it's more useful to keep the * origin at the origin */ diff --git a/common/common_plotHPGL_functions.cpp b/common/common_plotHPGL_functions.cpp index dcb38b9b03..7c0b0ef380 100644 --- a/common/common_plotHPGL_functions.cpp +++ b/common/common_plotHPGL_functions.cpp @@ -26,6 +26,7 @@ void HPGL_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, wxASSERT( !outputFile ); plotOffset = aOffset; plotScale = aScale; + m_IUsPerDecimil = aIusPerDecimil; iuPerDeviceUnit = PLUsPERDECIMIL / aIusPerDecimil; /* Compute the paper size in IUs */ paperSize = pageInfo.GetSizeMils(); @@ -161,7 +162,7 @@ void HPGL_PLOTTER::PenTo( const wxPoint& pos, char plume ) DPOINT pos_dev = userToDeviceCoordinates( pos ); if( penLastpos != pos ) - fprintf( outputFile, "PA %.0f,%.0fd;\n", pos_dev.x, pos_dev.y ); + fprintf( outputFile, "PA %.0f,%.0f;\n", pos_dev.x, pos_dev.y ); penLastpos = pos; } diff --git a/common/common_plotPDF_functions.cpp b/common/common_plotPDF_functions.cpp index a410441a3f..0374621d3c 100644 --- a/common/common_plotPDF_functions.cpp +++ b/common/common_plotPDF_functions.cpp @@ -52,6 +52,7 @@ void PDF_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, plotMirror = aMirror; plotOffset = aOffset; plotScale = aScale; + m_IUsPerDecimil = aIusPerDecimil; // The CTM is set to 1 user unit per decimil iuPerDeviceUnit = 1.0 / aIusPerDecimil; @@ -425,10 +426,6 @@ int PDF_PLOTTER::startPdfStream(int handle) /** * Finish the current PDF stream (writes the deferred length, too) - * XXX the compression code is not very elegant... is slurps the - * whole stream in RAM, allocates an output buffer of the same size - * and try to FLATE it. Asserts if it couldn't... enhancements are - * welcome but for now it simply works */ void PDF_PLOTTER::closePdfStream() { @@ -730,7 +727,7 @@ void PDF_PLOTTER::Text( const wxPoint& aPos, bool aBold ) { // Emit native PDF text (if requested) - if( psTextMode != PSTEXTMODE_STROKE ) + if( m_textMode != PLOTTEXTMODE_STROKE ) { const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI") : (aBold ? "/KicadFontB" : "/KicadFont"); @@ -754,7 +751,7 @@ void PDF_PLOTTER::Text( const wxPoint& aPos, fprintf( workFile, "q %f %f %f %f %g %g cm BT %s %g Tf %d Tr %g Tz ", ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f, fontname, heightFactor, - (psTextMode == PSTEXTMODE_NATIVE) ? 0 : 3, + (m_textMode == PLOTTEXTMODE_NATIVE) ? 0 : 3, wideningFactor * 100 ); // The text must be escaped correctly @@ -763,7 +760,7 @@ void PDF_PLOTTER::Text( const wxPoint& aPos, /* We are still in text coordinates, plot the overbars (if we're * not doing phantom text) */ - if( psTextMode == PSTEXTMODE_NATIVE ) + if( m_textMode == PLOTTEXTMODE_NATIVE ) { std::vector pos_pairs; postscriptOverlinePositions( aText, aSize.x, aItalic, aBold, &pos_pairs ); @@ -786,7 +783,7 @@ void PDF_PLOTTER::Text( const wxPoint& aPos, } // Plot the stroked text (if requested) - if( psTextMode != PSTEXTMODE_NATIVE ) + if( m_textMode != PLOTTEXTMODE_NATIVE ) { PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify, aWidth, aItalic, aBold ); diff --git a/common/common_plotPS_functions.cpp b/common/common_plotPS_functions.cpp index 4235706383..7f27bd5632 100644 --- a/common/common_plotPS_functions.cpp +++ b/common/common_plotPS_functions.cpp @@ -308,6 +308,7 @@ void PS_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, plotMirror = aMirror; plotOffset = aOffset; plotScale = aScale; + m_IUsPerDecimil = aIusPerDecimil; iuPerDeviceUnit = 1.0 / aIusPerDecimil; /* Compute the paper size in IUs */ paperSize = pageInfo.GetSizeMils(); @@ -818,7 +819,7 @@ void PS_PLOTTER::Text( const wxPoint& aPos, SetColor( aColor ); // Draw the native postscript text (if requested) - if( psTextMode == PSTEXTMODE_NATIVE ) + if( m_textMode == PLOTTEXTMODE_NATIVE ) { const char *fontname = aItalic ? (aBold ? "/KicadFont-BoldOblique" : "/KicadFont-Oblique") @@ -862,7 +863,7 @@ void PS_PLOTTER::Text( const wxPoint& aPos, } // Draw the hidden postscript text (if requested) - if( psTextMode == PSTEXTMODE_PHANTOM ) + if( m_textMode == PLOTTEXTMODE_PHANTOM ) { fputsPostscriptString( outputFile, aText ); DPOINT pos_dev = userToDeviceCoordinates( aPos ); @@ -871,7 +872,7 @@ void PS_PLOTTER::Text( const wxPoint& aPos, } // Draw the stroked text (if requested) - if( psTextMode != PSTEXTMODE_NATIVE ) + if( m_textMode != PLOTTEXTMODE_NATIVE ) { PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify, aWidth, aItalic, aBold ); diff --git a/common/common_plot_functions.cpp b/common/common_plot_functions.cpp index 1bfecab7a1..714544d9ed 100644 --- a/common/common_plot_functions.cpp +++ b/common/common_plot_functions.cpp @@ -16,23 +16,47 @@ #include #include + +wxString GetDefaultPlotExtension( PlotFormat aFormat ) +{ + switch( aFormat ) + { + case PLOT_FORMAT_DXF: + return DXF_PLOTTER::GetDefaultFileExtension(); + + case PLOT_FORMAT_POST: + return PS_PLOTTER::GetDefaultFileExtension(); + + case PLOT_FORMAT_PDF: + return PDF_PLOTTER::GetDefaultFileExtension(); + + case PLOT_FORMAT_HPGL: + return HPGL_PLOTTER::GetDefaultFileExtension(); + + case PLOT_FORMAT_GERBER: + return GERBER_PLOTTER::GetDefaultFileExtension(); + + default: + wxASSERT( false ); + return wxEmptyString; + } +} + /* Plot sheet references * margin is in mils (1/1000 inch) */ -void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int aLineWidth ) +void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock, + const PAGE_INFO& aPageInfo, + int aSheetNumber, int aNumberOfSheets, + const wxString &aSheetDesc, + const wxString &aFilename ) { -#define WSTEXTSIZE 50 // Text size in mils - - const PAGE_INFO& pageInfo = GetPageSettings(); - wxSize pageSize = pageInfo.GetSizeMils(); // mils - int xg, yg; - - wxPoint pos, ref; - EDA_COLOR_T color; - - // Paper is sized in mils. Here is a conversion factor to scale mils to internal units. - int iusPerMil = screen->MilsToIuScalar(); + static const int WSTEXTSIZE = 50; // Text size in mils + int iusPerMil = plotter->GetIUsPerDecimil() * 10; + wxSize pageSize = aPageInfo.GetSizeMils(); // in mils + int xg, yg; + wxPoint pos, ref; wxString msg; wxSize text_size; @@ -42,22 +66,17 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a wxSize text_size1_5; #else int UpperLimit = VARIABLE_BLOCK_START_POSITION; - bool bold = false; #endif - bool italic = false; - int thickness = aLineWidth; - - color = BLACK; - plotter->SetColor( color ); - plotter->SetCurrentLineWidth( thickness ); + plotter->SetColor( BLACK ); + plotter->SetCurrentLineWidth( PLOTTER::DEFAULT_LINE_WIDTH ); // Plot edge. - ref.x = pageInfo.GetLeftMarginMils() * iusPerMil; - ref.y = pageInfo.GetTopMarginMils() * iusPerMil; + ref.x = aPageInfo.GetLeftMarginMils() * iusPerMil; + ref.y = aPageInfo.GetTopMarginMils() * iusPerMil; - xg = ( pageSize.x - pageInfo.GetRightMarginMils() ) * iusPerMil; - yg = ( pageSize.y - pageInfo.GetBottomMarginMils() ) * iusPerMil; + xg = ( pageSize.x - aPageInfo.GetRightMarginMils() ) * iusPerMil; + yg = ( pageSize.y - aPageInfo.GetBottomMarginMils() ) * iusPerMil; #if defined(KICAD_GOST) plotter->MoveTo( ref ); @@ -105,12 +124,12 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a text_size.y = WSTEXTSIZE * iusPerMil; // upper left corner in mils - ref.x = pageInfo.GetLeftMarginMils(); - ref.y = pageInfo.GetTopMarginMils(); + ref.x = aPageInfo.GetLeftMarginMils(); + ref.y = aPageInfo.GetTopMarginMils(); // lower right corner in mils - xg = ( pageSize.x - pageInfo.GetRightMarginMils() ); - yg = ( pageSize.y - pageInfo.GetBottomMarginMils() ); + xg = ( pageSize.x - aPageInfo.GetRightMarginMils() ); + yg = ( pageSize.y - aPageInfo.GetBottomMarginMils() ); #if defined(KICAD_GOST) for( Ki_WorkSheetData* WsItem = &WS_Segm1_LU; @@ -128,10 +147,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a case WS_PODPIS_LU: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_VERT, text_size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_BOTTOM, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_SEGMENT_LU: @@ -183,10 +202,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a pos.x = ( ii - gxpas / 2 ) * iusPerMil; pos.y = ( ref.y + GRID_REF_W / 2 ) * iusPerMil; - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); if( ii < xg - PAS_REF / 2 ) { @@ -199,10 +218,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a } pos.x = ( ii - gxpas / 2 ) * iusPerMil; pos.y = ( yg - GRID_REF_W / 2 ) * iusPerMil; - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } // Plot legend along the Y axis. @@ -225,10 +244,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a } pos.x = ( ref.x + GRID_REF_W / 2 ) * iusPerMil; pos.y = ( ii - gypas / 2 ) * iusPerMil; - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); if( ii < yg - PAS_REF / 2 ) { @@ -242,9 +261,9 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a pos.x = ( xg - GRID_REF_W / 2 ) * iusPerMil; pos.y = ( ii - gypas / 2 ) * iusPerMil; - plotter->Text( pos, color, msg, TEXT_ORIENT_HORIZ, text_size, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } #endif @@ -261,10 +280,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a text_size1_5.x = SIZETEXT * iusPerMil * 1.5; text_size1_5.y = SIZETEXT * iusPerMil * 1.5; - ref.x = pageSize.x - pageInfo.GetRightMarginMils(); - ref.y = pageSize.y - pageInfo.GetBottomMarginMils(); + ref.x = pageSize.x - aPageInfo.GetRightMarginMils(); + ref.y = pageSize.y - aPageInfo.GetBottomMarginMils(); - if( screen->m_ScreenNumber == 1 ) + if( aSheetNumber == 1 ) { for( Ki_WorkSheetData* WsItem = &WS_Date; WsItem != NULL; @@ -288,10 +307,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a case WS_PODPIS: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_SIZESHEET: @@ -300,93 +319,93 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a case WS_IDENTSHEET: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - if( screen->m_NumberOfScreens > 1 ) - msg << screen->m_ScreenNumber; - plotter->Text( pos, color, + if( aNumberOfSheets > 1 ) + msg << aSheetNumber; + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_SHEETS: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - msg << screen->m_NumberOfScreens; - plotter->Text( pos, color, + msg << aNumberOfSheets; + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_COMPANY_NAME: - msg = GetTitleBlock().GetCompany(); + msg = aTitleBlock.GetCompany(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size1_5, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_TITLE: - msg = GetTitleBlock().GetTitle(); + msg = aTitleBlock.GetTitle(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size1_5, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_COMMENT1: - msg = GetTitleBlock().GetComment1(); + msg = aTitleBlock.GetComment1(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size3, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); - pos.x = (pageInfo.GetLeftMarginMils() + 1260) * iusPerMil; - pos.y = (pageInfo.GetTopMarginMils() + 270) * iusPerMil; - plotter->Text( pos, color, + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); + pos.x = (aPageInfo.GetLeftMarginMils() + 1260) * iusPerMil; + pos.y = (aPageInfo.GetTopMarginMils() + 270) * iusPerMil; + plotter->Text( pos, BLACK, msg.GetData(), 1800, text_size2, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_COMMENT2: - msg = GetTitleBlock().GetComment2(); + msg = aTitleBlock.GetComment2(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_COMMENT3: - msg = GetTitleBlock().GetComment3(); + msg = aTitleBlock.GetComment3(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_COMMENT4: - msg = GetTitleBlock().GetComment4(); + msg = aTitleBlock.GetComment4(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; @@ -415,37 +434,37 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a { case WS_CADRE: // Begin list number > 1 - msg = GetTitleBlock().GetComment1(); + msg = aTitleBlock.GetComment1(); if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size3, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); - pos.x = (pageInfo.GetLeftMarginMils() + 1260) * iusPerMil; - pos.y = (pageInfo.GetTopMarginMils() + 270) * iusPerMil; - plotter->Text( pos, color, + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); + pos.x = (aPageInfo.GetLeftMarginMils() + 1260) * iusPerMil; + pos.y = (aPageInfo.GetTopMarginMils() + 270) * iusPerMil; + plotter->Text( pos, BLACK, msg, 1800, text_size2, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); } break; case WS_PODPIS_D: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - plotter->Text( pos, color, msg, TEXT_ORIENT_HORIZ, text_size, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_IDENTSHEET_D: if( WsItem->m_Legende ) msg = WsItem->m_Legende; - msg << screen->m_ScreenNumber; - plotter->Text( pos, color, msg, TEXT_ORIENT_HORIZ, text_size, + msg << aSheetNumber; + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, false ); + PLOTTER::DEFAULT_LINE_WIDTH, false, false ); break; case WS_LEFT_SEGMENT_D: @@ -461,16 +480,17 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a #else - ref.x = pageSize.x - GRID_REF_W - pageInfo.GetRightMarginMils(); - ref.y = pageSize.y - GRID_REF_W - pageInfo.GetBottomMarginMils(); + ref.x = pageSize.x - GRID_REF_W - aPageInfo.GetRightMarginMils(); + ref.y = pageSize.y - GRID_REF_W - aPageInfo.GetBottomMarginMils(); for( Ki_WorkSheetData* WsItem = &WS_Date; WsItem != NULL; WsItem = WsItem->Pnext ) { + bool bold = false; + pos.x = ( ref.x - WsItem->m_Posx ) * iusPerMil; pos.y = ( ref.y - WsItem->m_Posy ) * iusPerMil; - bold = false; if( WsItem->m_Legende ) msg = WsItem->m_Legende; else @@ -479,12 +499,12 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a switch( WsItem->m_Type ) { case WS_DATE: - msg += GetTitleBlock().GetDate(); + msg += aTitleBlock.GetDate(); bold = true; break; case WS_REV: - msg += GetTitleBlock().GetRevision(); + msg += aTitleBlock.GetRevision(); bold = true; break; @@ -493,61 +513,57 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a break; case WS_SIZESHEET: - msg += pageInfo.GetType(); + msg += aPageInfo.GetType(); break; case WS_IDENTSHEET: - msg << screen->m_ScreenNumber << wxT( "/" ) << - screen->m_NumberOfScreens; + msg << aSheetNumber << wxT( "/" ) << aNumberOfSheets; break; case WS_FILENAME: { wxString fname, fext; - wxFileName::SplitPath( screen->GetFileName(), - (wxString*) NULL, - &fname, - &fext ); + wxFileName::SplitPath( aFilename, NULL, &fname, &fext ); msg << fname << wxT( "." ) << fext; } break; case WS_FULLSHEETNAME: - msg += GetScreenDesc(); + msg += aSheetDesc; break; case WS_COMPANY_NAME: - msg += GetTitleBlock().GetCompany(); + msg += aTitleBlock.GetCompany(); if( !msg.IsEmpty() ) UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT ); bold = true; break; case WS_TITLE: - msg += GetTitleBlock().GetTitle(); + msg += aTitleBlock.GetTitle(); bold = true; break; case WS_COMMENT1: - msg += GetTitleBlock().GetComment1(); + msg += aTitleBlock.GetComment1(); if( !msg.IsEmpty() ) UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT ); break; case WS_COMMENT2: - msg += GetTitleBlock().GetComment2(); + msg += aTitleBlock.GetComment2(); if( !msg.IsEmpty() ) UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT ); break; case WS_COMMENT3: - msg += GetTitleBlock().GetComment3(); + msg += aTitleBlock.GetComment3(); if( !msg.IsEmpty() ) UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT ); break; case WS_COMMENT4: - msg += GetTitleBlock().GetComment4(); + msg += aTitleBlock.GetComment4(); if( !msg.IsEmpty() ) UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT ); break; @@ -574,10 +590,10 @@ void EDA_DRAW_FRAME::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen, int a if( !msg.IsEmpty() ) { - plotter->Text( pos, color, + plotter->Text( pos, BLACK, msg, TEXT_ORIENT_HORIZ, text_size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, - thickness, italic, bold ); + PLOTTER::DEFAULT_LINE_WIDTH, bold, false ); } } diff --git a/common/worksheet.cpp b/common/worksheet.cpp index 356bbb6740..1917d091aa 100644 --- a/common/worksheet.cpp +++ b/common/worksheet.cpp @@ -1004,7 +1004,7 @@ Ki_WorkSheetData WS_Segm5_LT = void EDA_DRAW_FRAME::TraceWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWidth, - double aScalar ) + double aScalar, const wxString &aFilename ) { if( !m_showBorderAndTitleBlock ) return; @@ -1024,7 +1024,7 @@ void EDA_DRAW_FRAME::TraceWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineW wxPoint margin_left_top( pageInfo.GetLeftMarginMils(), pageInfo.GetTopMarginMils() ); wxPoint margin_right_bottom( pageInfo.GetRightMarginMils(), pageInfo.GetBottomMarginMils() ); wxString paper = pageInfo.GetType(); - wxString file = aScreen->GetFileName(); + wxString file = aFilename; TITLE_BLOCK t_block = GetTitleBlock(); int number_of_screens = aScreen->m_NumberOfScreens; int screen_to_draw = aScreen->m_ScreenNumber; diff --git a/eeschema/dialogs/dialog_SVG_print.cpp b/eeschema/dialogs/dialog_SVG_print.cpp index 5816f77655..d174312eaa 100644 --- a/eeschema/dialogs/dialog_SVG_print.cpp +++ b/eeschema/dialogs/dialog_SVG_print.cpp @@ -237,7 +237,8 @@ bool DIALOG_SVG_PRINT::DrawSVGPage( EDA_DRAW_FRAME* frame, sheetSize.y/2) ); if( aPrint_Sheet_Ref ) - frame->TraceWorkSheet( &dc, screen, g_DrawDefaultLineThickness, IU_PER_MILS ); + frame->TraceWorkSheet( &dc, screen, g_DrawDefaultLineThickness, + IU_PER_MILS, frame->GetScreenDesc() ); screen->m_IsPrinting = false; panel->SetClipBox( tmp ); diff --git a/eeschema/dialogs/dialog_plot_schematic_DXF.cpp b/eeschema/dialogs/dialog_plot_schematic_DXF.cpp index 7427f23457..79537a4ca1 100644 --- a/eeschema/dialogs/dialog_plot_schematic_DXF.cpp +++ b/eeschema/dialogs/dialog_plot_schematic_DXF.cpp @@ -188,7 +188,8 @@ void DIALOG_PLOT_SCHEMATIC_DXF::CreateDXFFile( ) plot_offset.x = 0; plot_offset.y = 0; - plotFileName = schframe->GetUniqueFilenameForCurrentSheet() + wxT( ".dxf" ); + plotFileName = schframe->GetUniqueFilenameForCurrentSheet() + '.' + + DXF_PLOTTER::GetDefaultFileExtension(); PlotOneSheetDXF( plotFileName, screen, plot_offset, 1 ); @@ -229,9 +230,8 @@ void DIALOG_PLOT_SCHEMATIC_DXF::PlotOneSheetDXF( const wxString& FileName, const PAGE_INFO& pageInfo = screen->GetPageSettings(); plotter->SetPageSettings( pageInfo ); - - plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, 0 ); plotter->SetColorMode( m_plotColorOpt ); + plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-DXF" ) ); @@ -241,7 +241,11 @@ void DIALOG_PLOT_SCHEMATIC_DXF::PlotOneSheetDXF( const wxString& FileName, if( m_plot_Sheet_Ref ) { plotter->SetColor( BLACK ); - m_Parent->PlotWorkSheet( plotter, screen, g_DrawDefaultLineThickness ); + PlotWorkSheet( plotter, m_Parent->GetTitleBlock(), + m_Parent->GetPageSettings(), + screen->m_ScreenNumber, screen->m_NumberOfScreens, + m_Parent->GetScreenDesc(), + screen->GetFileName() ); } screen->Plot( plotter ); diff --git a/eeschema/dialogs/dialog_plot_schematic_HPGL.cpp b/eeschema/dialogs/dialog_plot_schematic_HPGL.cpp index 69a22ee85e..fffc916e8a 100644 --- a/eeschema/dialogs/dialog_plot_schematic_HPGL.cpp +++ b/eeschema/dialogs/dialog_plot_schematic_HPGL.cpp @@ -336,7 +336,8 @@ void DIALOG_PLOT_SCHEMATIC_HPGL::Plot_Schematic_HPGL( bool aPlotAll ) plotOffset.x = -s_Offset.x; plotOffset.y = -s_Offset.y; - plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() + wxT( ".plt" ); + plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() + '.' + + HPGL_PLOTTER::GetDefaultFileExtension(); LOCALE_IO toggle; @@ -379,9 +380,7 @@ void DIALOG_PLOT_SCHEMATIC_HPGL::Plot_1_Page_HPGL( const wxString& FileName, HPGL_PLOTTER* plotter = new HPGL_PLOTTER(); plotter->SetPageSettings( pageInfo ); - - plotter->SetViewport( offset, IU_PER_DECIMILS, plot_scale, 0 ); - plotter->SetDefaultLineWidth( g_DrawDefaultLineThickness ); + plotter->SetViewport( offset, IU_PER_DECIMILS, plot_scale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-HPGL" ) ); @@ -395,7 +394,11 @@ void DIALOG_PLOT_SCHEMATIC_HPGL::Plot_1_Page_HPGL( const wxString& FileName, plotter->SetColor( BLACK ); if( s_plot_Sheet_Ref ) - m_Parent->PlotWorkSheet( plotter, screen, g_DrawDefaultLineThickness ); + PlotWorkSheet( plotter, m_Parent->GetTitleBlock(), + m_Parent->GetPageSettings(), + screen->m_ScreenNumber, screen->m_NumberOfScreens, + m_Parent->GetScreenDesc(), + screen->GetFileName() ); screen->Plot( plotter ); diff --git a/eeschema/dialogs/dialog_plot_schematic_PDF.cpp b/eeschema/dialogs/dialog_plot_schematic_PDF.cpp index 1902fb323a..25799aef05 100644 --- a/eeschema/dialogs/dialog_plot_schematic_PDF.cpp +++ b/eeschema/dialogs/dialog_plot_schematic_PDF.cpp @@ -193,8 +193,6 @@ void DIALOG_PLOT_SCHEMATIC_PDF::createPDFFile() plotter->SetDefaultLineWidth( g_DrawDefaultLineThickness ); plotter->SetColorMode( m_plotColorOpt ); plotter->SetCreator( wxT( "Eeschema-PDF" ) ); - plotter->SetPsTextMode( PSTEXTMODE_PHANTOM ); - // First page handling is different bool first_page = true; @@ -220,8 +218,8 @@ void DIALOG_PLOT_SCHEMATIC_PDF::createPDFFile() if( first_page ) { wxString msg; - wxString plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() - + wxT( ".pdf" ); + wxString plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() + '.' + + PDF_PLOTTER::GetDefaultFileExtension(); msg.Printf( _( "Plot: %s " ), GetChars( plotFileName ) ); m_MsgBox->AppendText( msg ); @@ -291,8 +289,8 @@ void DIALOG_PLOT_SCHEMATIC_PDF::plotSetupPage( PDF_PLOTTER* plotter, double scalex = (double) plotPage.GetWidthMils() / actualPage.GetWidthMils(); double scaley = (double) plotPage.GetHeightMils() / actualPage.GetHeightMils(); double scale = MIN( scalex, scaley ); - plotter->SetViewport( wxPoint( 0, 0 ), IU_PER_DECIMILS, scale, 0 ); plotter->SetPageSettings( plotPage ); + plotter->SetViewport( wxPoint( 0, 0 ), IU_PER_DECIMILS, scale, false ); } void DIALOG_PLOT_SCHEMATIC_PDF::plotOneSheet( PDF_PLOTTER* plotter, @@ -300,8 +298,12 @@ void DIALOG_PLOT_SCHEMATIC_PDF::plotOneSheet( PDF_PLOTTER* plotter, { if( m_plot_Sheet_Ref ) { - plotter->SetColor( BLACK ); - m_Parent->PlotWorkSheet( plotter, screen, g_DrawDefaultLineThickness ); + plotter->SetColor( BLACK ); + PlotWorkSheet( plotter, m_Parent->GetTitleBlock(), + m_Parent->GetPageSettings(), + screen->m_ScreenNumber, screen->m_NumberOfScreens, + m_Parent->GetScreenDesc(), + screen->GetFileName() ); } screen->Plot( plotter ); diff --git a/eeschema/dialogs/dialog_plot_schematic_PS.cpp b/eeschema/dialogs/dialog_plot_schematic_PS.cpp index 2b7034bf24..94068191d8 100644 --- a/eeschema/dialogs/dialog_plot_schematic_PS.cpp +++ b/eeschema/dialogs/dialog_plot_schematic_PS.cpp @@ -242,7 +242,8 @@ void DIALOG_PLOT_SCHEMATIC_PS::createPSFile() plot_offset.x = 0; plot_offset.y = 0; - plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() + wxT( ".ps" ); + plotFileName = m_Parent->GetUniqueFilenameForCurrentSheet() + '.' + + PS_PLOTTER::GetDefaultFileExtension(); plotOneSheetPS( plotFileName, screen, plotPage, plot_offset, scale ); @@ -281,10 +282,9 @@ void DIALOG_PLOT_SCHEMATIC_PS::plotOneSheetPS( const wxString& FileName, PS_PLOTTER* plotter = new PS_PLOTTER(); plotter->SetPageSettings( pageInfo ); - plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, 0 ); plotter->SetDefaultLineWidth( g_DrawDefaultLineThickness ); plotter->SetColorMode( m_plotColorOpt ); - plotter->SetPsTextMode( PSTEXTMODE_STROKE ); + plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-PS" ) ); @@ -294,7 +294,11 @@ void DIALOG_PLOT_SCHEMATIC_PS::plotOneSheetPS( const wxString& FileName, if( m_plot_Sheet_Ref ) { plotter->SetColor( BLACK ); - m_Parent->PlotWorkSheet( plotter, screen, g_DrawDefaultLineThickness ); + PlotWorkSheet( plotter, m_Parent->GetTitleBlock(), + m_Parent->GetPageSettings(), + screen->m_ScreenNumber, screen->m_NumberOfScreens, + m_Parent->GetScreenDesc(), + screen->GetFileName() ); } screen->Plot( plotter ); diff --git a/eeschema/dialogs/dialog_print_using_printer.cpp b/eeschema/dialogs/dialog_print_using_printer.cpp index ce73637993..aceacedff4 100644 --- a/eeschema/dialogs/dialog_print_using_printer.cpp +++ b/eeschema/dialogs/dialog_print_using_printer.cpp @@ -420,7 +420,8 @@ void SCH_PRINTOUT::DrawPage( SCH_SCREEN* aScreen ) aScreen->Draw( panel, dc, GR_DEFAULT_DRAWMODE ); if( printReference ) - parent->TraceWorkSheet( dc, aScreen, g_DrawDefaultLineThickness, IU_PER_MILS ); + parent->TraceWorkSheet( dc, aScreen, g_DrawDefaultLineThickness, + IU_PER_MILS, parent->GetScreenDesc() ); g_DrawBgColor = bg_color; aScreen->m_IsPrinting = false; diff --git a/eeschema/eeredraw.cpp b/eeschema/eeredraw.cpp index f14b07820a..63acb50cf0 100644 --- a/eeschema/eeredraw.cpp +++ b/eeschema/eeredraw.cpp @@ -71,7 +71,8 @@ void SCH_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) GetScreen()->Draw( m_canvas, DC, GR_DEFAULT_DRAWMODE ); - TraceWorkSheet( DC, GetScreen(), g_DrawDefaultLineThickness, IU_PER_MILS ); + TraceWorkSheet( DC, GetScreen(), g_DrawDefaultLineThickness, IU_PER_MILS, + GetScreenDesc() ); #ifdef USE_WX_OVERLAY if( IsShown() ) diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 3ba1e35892..8267e620ca 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -861,7 +861,8 @@ void SCH_EDIT_FRAME::SVG_Print( wxCommandEvent& event ) void SCH_EDIT_FRAME::PrintPage( wxDC* aDC, int aPrintMask, bool aPrintMirrorMode, void* aData ) { GetScreen()->Draw( m_canvas, aDC, GR_DEFAULT_DRAWMODE ); - TraceWorkSheet( aDC, GetScreen(), g_DrawDefaultLineThickness, IU_PER_MILS ); + TraceWorkSheet( aDC, GetScreen(), g_DrawDefaultLineThickness, IU_PER_MILS, + GetScreenDesc() ); } diff --git a/gerbview/dialogs/dialog_print_using_printer.cpp b/gerbview/dialogs/dialog_print_using_printer.cpp index 6a86ba0a38..8573e1306f 100644 --- a/gerbview/dialogs/dialog_print_using_printer.cpp +++ b/gerbview/dialogs/dialog_print_using_printer.cpp @@ -318,7 +318,6 @@ void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) int idx = m_ScaleOption->GetSelection(); s_Parameters.m_PrintScale = s_ScaleList[idx]; - g_pcb_plot_options.Scale = s_Parameters.m_PrintScale; if( m_FineAdjustXscaleOpt ) { @@ -335,8 +334,6 @@ void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) DisplayInfoMessage( NULL, _( "Warning: Scale option set to a very small value" ) ); m_FineAdjustYscaleOpt->GetValue().ToDouble( &s_Parameters.m_YScaleAdjust ); } - g_pcb_plot_options.ScaleAdjX = s_Parameters.m_XScaleAdjust; - g_pcb_plot_options.ScaleAdjX = s_Parameters.m_YScaleAdjust; } void DIALOG_PRINT_USING_PRINTER::OnScaleSelectionClick( wxCommandEvent& event ) diff --git a/gerbview/draw_gerber_screen.cpp b/gerbview/draw_gerber_screen.cpp index dce9aec1a2..d6b39f7bf5 100644 --- a/gerbview/draw_gerber_screen.cpp +++ b/gerbview/draw_gerber_screen.cpp @@ -105,7 +105,7 @@ void GERBVIEW_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) if( IsElementVisible( DCODES_VISIBLE ) ) DrawItemsDCodeID( DC, GR_COPY ); - TraceWorkSheet( DC, screen, 0, IU_PER_MILS ); + TraceWorkSheet( DC, screen, 0, IU_PER_MILS, wxEmptyString ); if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); diff --git a/gerbview/files.cpp b/gerbview/files.cpp index 5679bc189f..5d0a8aaf7d 100644 --- a/gerbview/files.cpp +++ b/gerbview/files.cpp @@ -177,13 +177,13 @@ bool GERBVIEW_FRAME::LoadGerberFiles( const wxString& aFullFileName ) if( !filename.IsAbsolute() ) filename.SetPath( currentPath ); - GetScreen()->SetFileName( filename.GetFullPath() ); + m_lastFileName = filename.GetFullPath(); setActiveLayer( layer, false ); if( Read_GERBER_File( filename.GetFullPath(), filename.GetFullPath() ) ) { - UpdateFileHistory( GetScreen()->GetFileName() ); + UpdateFileHistory( m_lastFileName ); layer = getNextAvailableLayer( layer ); @@ -258,7 +258,7 @@ bool GERBVIEW_FRAME::LoadExcellonFiles( const wxString& aFullFileName ) if( !filename.IsAbsolute() ) filename.SetPath( currentPath ); - GetScreen()->SetFileName( filename.GetFullPath() ); + m_lastFileName = filename.GetFullPath(); setActiveLayer( layer, false ); @@ -301,7 +301,7 @@ bool GERBVIEW_FRAME::LoadDCodeFile( const wxString& aFullFileName ) { wildcard = _( "Gerber DCODE files" ); wildcard += wxT(" ") + AllFilesWildcard; - fn = GetScreen()->GetFileName(); + fn = m_lastFileName; wxFileDialog dlg( this, _( "Load GERBER DCODE File" ), fn.GetPath(), fn.GetFullName(), wildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST ); diff --git a/gerbview/gerbview_frame.h b/gerbview/gerbview_frame.h index 0cb7d9bf06..1c257b9b09 100644 --- a/gerbview/gerbview_frame.h +++ b/gerbview/gerbview_frame.h @@ -162,6 +162,8 @@ protected: // Auxiliary file history used to store drill files history. wxFileHistory m_drillFileHistory; + /// The last filename chosen to be proposed to the user + wxString m_lastFileName; public: GBR_LAYER_BOX_SELECTOR* m_SelLayerBox; DCODE_SELECTION_BOX* m_DCodeSelector; // a list box to select the dcode Id to highlight. diff --git a/gerbview/pcbplot.cpp b/gerbview/pcbplot.cpp index b130bda6a8..b2f089e096 100644 --- a/gerbview/pcbplot.cpp +++ b/gerbview/pcbplot.cpp @@ -9,10 +9,6 @@ #include -/* The group of plot options - sadly global XXX */ -PCB_Plot_Options g_pcb_plot_options; - - /**************************************************************/ /* void PCB_BASE_FRAME::ToPlotter(wxCommandEvent& event) */ /***************************************************************/ diff --git a/gerbview/pcbplot.h b/gerbview/pcbplot.h index 8207402e82..72eeecf906 100644 --- a/gerbview/pcbplot.h +++ b/gerbview/pcbplot.h @@ -37,32 +37,4 @@ #define OPTKEY_PRINT_PAGE_FRAME wxT( "PrintPageFrame" ) #define OPTKEY_PRINT_MONOCHROME_MODE wxT( "PrintMonochrome" ) -/* Plot Options : */ -struct PCB_Plot_Options -{ - bool Exclude_Edges_Pcb; - int PlotLine_Width; - bool Plot_Frame_Ref; // True to plot/print frame references - int Plot_Mode; - bool Plot_Set_MIROIR; - bool Sel_Rotate_Window; - int HPGL_Pen_Num; - int HPGL_Pen_Speed; - int HPGL_Pen_Diam; - int HPGL_Pen_Recouvrement; - bool HPGL_Org_Centre; // true if, HPGL originally the center of the node - int PlotPSColorOpt; // True for color Postscript output - bool Plot_PS_Negative; // True to create a negative board ps plot - - /* id for plot format (see enum PlotFormat in plot_common.h) */ - int PlotFormat; - int PlotOrient; - int PlotScaleOpt; - int DrillShapeOpt; - double Scale; - double ScaleAdjX; - double ScaleAdjY; -}; -extern PCB_Plot_Options g_pcb_plot_options; - #endif // ifndef PCBPLOT_H diff --git a/include/base_struct.h b/include/base_struct.h index c2223b5326..3e43ed977c 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -215,7 +215,7 @@ public: m_Size( aSize ) { } - wxPoint Centre() + wxPoint Centre() const { return wxPoint( m_Pos.x + ( m_Size.x >> 1 ), m_Pos.y + ( m_Size.y >> 1 ) ); diff --git a/include/class_base_screen.h b/include/class_base_screen.h index 2de82a5813..e7d665d808 100644 --- a/include/class_base_screen.h +++ b/include/class_base_screen.h @@ -76,7 +76,6 @@ class BASE_SCREEN : public EDA_ITEM { private: GRIDS m_grids; ///< List of valid grid sizes. - wxString m_fileName; ///< File used to load the screen. bool m_FlagModified; ///< Indicates current drawing has been modified. bool m_FlagSave; ///< Indicates automatic file save. EDA_ITEM* m_CurrentItem; ///< Currently selected object @@ -153,10 +152,6 @@ public: void InitDataPoints( const wxSize& aPageSizeInternalUnits ); - void SetFileName( const wxString& aFileName ) { m_fileName = aFileName; } - - wxString GetFileName() const { return m_fileName; } - /** * Function MilsToIuScalar * returns the scalar required to convert mils to internal units. diff --git a/include/class_sch_screen.h b/include/class_sch_screen.h index d50c3243df..5dc5ccbc27 100644 --- a/include/class_sch_screen.h +++ b/include/class_sch_screen.h @@ -62,6 +62,9 @@ enum SCH_LINE_TEST_T class SCH_SCREEN : public BASE_SCREEN { +private: + wxString m_fileName; ///< File used to load the screen. + int m_refCount; ///< Number of sheets referencing this screen. ///< Delete when it goes to zero. @@ -105,6 +108,10 @@ public: const PAGE_INFO& GetPageSettings() const { return m_paper; } void SetPageSettings( const PAGE_INFO& aPageSettings ) { m_paper = aPageSettings; } + void SetFileName( const wxString& aFileName ) { m_fileName = aFileName; } + + const wxString& GetFileName() const { return m_fileName; } + const wxPoint& GetOriginAxisPosition() const { return m_originAxisPosition; } void SetOriginAxisPosition( const wxPoint& aPosition ) { m_originAxisPosition = aPosition; } diff --git a/include/plot_common.h b/include/plot_common.h index 662226a6a7..a5e56dd12d 100644 --- a/include/plot_common.h +++ b/include/plot_common.h @@ -34,11 +34,14 @@ enum PlotFormat { * 2) only use native postscript fonts * 3) use the internal vector font and add 'phantom' text to aid * searching + * + * This is recognized by the DXF driver too, where NATIVE emits + * TEXT entities instead of stroking the text */ -enum PostscriptTextMode { - PSTEXTMODE_STROKE, - PSTEXTMODE_NATIVE, - PSTEXTMODE_PHANTOM +enum PlotTextMode { + PLOTTEXTMODE_STROKE, + PLOTTEXTMODE_NATIVE, + PLOTTEXTMODE_PHANTOM }; @@ -51,6 +54,8 @@ enum PostscriptTextMode { class PLOTTER { public: + static const int DEFAULT_LINE_WIDTH = -1; + PLOTTER( ); virtual ~PLOTTER() @@ -97,7 +102,7 @@ public: /** * Set the default line width. Used at the beginning and when a width - * of -1 is requested. + * of -1 (DEFAULT_LINE_WIDTH) is requested. * @param width is specified in IUs */ virtual void SetDefaultLineWidth( int width ) = 0; @@ -148,13 +153,20 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ) = 0; + /** + * The IUs per decimil are an essential scaling factor when + * plotting; they are set and saved when establishing the viewport. + * Here they can be get back again + */ + double GetIUsPerDecimil() const { return m_IUsPerDecimil; } + // Low level primitives virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ) = 0; + int width = DEFAULT_LINE_WIDTH ) = 0; virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ) = 0; + int width = DEFAULT_LINE_WIDTH ) = 0; virtual void Arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon, - FILL_T fill, int width = -1 ); + FILL_T fill, int width = DEFAULT_LINE_WIDTH ); /** * moveto/lineto primitive, moves the 'pen' to the specified direction @@ -195,7 +207,7 @@ public: * @param aWidth = line width */ virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, FILL_T aFill, - int aWidth = -1 ) = 0; + int aWidth = DEFAULT_LINE_WIDTH ) = 0; /** * Function PlotImage @@ -274,6 +286,15 @@ public: // NOP for most plotters } + /** + * Change the current text mode. See the PlotTextMode + * explanation at the beginning of the file + */ + virtual void SetTextMode( PlotTextMode mode ) + { + // NOP for most plotters + } + protected: // These are marker subcomponents void markerCircle( const wxPoint& pos, int radius ); @@ -298,6 +319,12 @@ protected: /// Plot scale - chosen by the user (even implicitly with 'fit in a4') double plotScale; + /* Device scale (how many IUs in a decimil - always); it's a double + * because in eeschema there are 0.1 IUs in a decimil (eeschema + * always works in mils internally) while pcbnew can work in decimil + * or nanometers, so this value would be >= 1 */ + double m_IUsPerDecimil; + /// Device scale (from IUs to device units - usually decimils) double iuPerDeviceUnit; @@ -336,6 +363,11 @@ public: return PLOT_FORMAT_HPGL; } + static wxString GetDefaultFileExtension() + { + return wxString( wxT( "plt" ) ); + } + virtual bool StartPlot( FILE* fout ); virtual bool EndPlot(); @@ -378,16 +410,16 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ); virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, - FILL_T aFill, int aWidth = -1); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH); virtual void ThickSegment( const wxPoint& start, const wxPoint& end, int width, EDA_DRAW_MODE_T tracemode ); virtual void Arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon, - FILL_T fill, int width = -1 ); + FILL_T fill, int width = DEFAULT_LINE_WIDTH ); virtual void PenTo( const wxPoint& pos, char plume ); virtual void FlashPadCircle( const wxPoint& pos, int diametre, EDA_DRAW_MODE_T trace_mode ); @@ -416,16 +448,16 @@ class PSLIKE_PLOTTER : public PLOTTER { public: PSLIKE_PLOTTER() : plotScaleAdjX( 1 ), plotScaleAdjY( 1 ), plotWidthAdj( 0 ), - psTextMode( PSTEXTMODE_PHANTOM ) + m_textMode( PLOTTEXTMODE_PHANTOM ) { } /** - * Change the current postscript text mode + * PS and PDF fully implement native text (for the Latin-1 subset) */ - void SetPsTextMode( PostscriptTextMode mode ) + virtual void SetTextMode( PlotTextMode mode ) { - psTextMode = mode; + m_textMode = mode; } virtual void SetDefaultLineWidth( int width ); @@ -510,7 +542,7 @@ protected: double plotWidthAdj; /// How to draw text - PostscriptTextMode psTextMode; + PlotTextMode m_textMode; }; @@ -521,6 +553,11 @@ public: { } + static wxString GetDefaultFileExtension() + { + return wxString( wxT( "ps" ) ); + } + virtual PlotFormat GetPlotterType() const { return PLOT_FORMAT_POST; @@ -534,14 +571,14 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ); virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Arc( const wxPoint& centre, int StAngle, int EndAngle, - int rayon, FILL_T fill, int width = -1 ); + int rayon, FILL_T fill, int width = DEFAULT_LINE_WIDTH ); virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, - FILL_T aFill, int aWidth = -1); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH ); virtual void PlotImage( const wxImage& aImage, const wxPoint& aPos, double aScaleFactor ); @@ -573,6 +610,11 @@ public: return PLOT_FORMAT_PDF; } + static wxString GetDefaultFileExtension() + { + return wxString( wxT( "pdf" ) ); + } + virtual bool StartPlot( FILE* fout ); virtual bool EndPlot(); virtual void StartPage(); @@ -586,14 +628,14 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ); virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Arc( const wxPoint& centre, int StAngle, int EndAngle, - int rayon, FILL_T fill, int width = -1 ); + int rayon, FILL_T fill, int width = DEFAULT_LINE_WIDTH ); virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, - FILL_T aFill, int aWidth = -1); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH); virtual void PenTo( const wxPoint& pos, char plume ); @@ -665,6 +707,11 @@ public: return PLOT_FORMAT_GERBER; } + static wxString GetDefaultFileExtension() + { + return wxString( wxT( "pho" ) ); + } + virtual bool StartPlot( FILE* fout ); virtual bool EndPlot(); virtual void SetCurrentLineWidth( int width ); @@ -676,13 +723,13 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ); virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Arc( const wxPoint& aCenter, int aStAngle, int aEndAngle, int aRadius, - FILL_T aFill, int aWidth = -1 ); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH ); virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, - FILL_T aFill, int aWidth = -1); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH ); virtual void PenTo( const wxPoint& pos, char plume ); virtual void FlashPadCircle( const wxPoint& pos, int diametre, @@ -727,10 +774,17 @@ public: return PLOT_FORMAT_DXF; } - /// We can plot text as strokes or as TEXT entities - void SetDXFTextMode( bool aTextAsLines ) + static wxString GetDefaultFileExtension() { - textAsLines = aTextAsLines; + return wxString( wxT( "dxf" ) ); + } + + /** + * DXF handles NATIVE text emitting TEXT entities + */ + virtual void SetTextMode( PlotTextMode mode ) + { + textAsLines = ( mode != PLOTTEXTMODE_NATIVE ); } virtual bool StartPlot( FILE* fout ); @@ -755,15 +809,15 @@ public: virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil, double aScale, bool aMirror ); virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, - int width = -1 ); + int width = DEFAULT_LINE_WIDTH ); virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, - FILL_T aFill, int aWidth = -1 ); + FILL_T aFill, int aWidth = DEFAULT_LINE_WIDTH ); virtual void ThickSegment( const wxPoint& start, const wxPoint& end, int width, EDA_DRAW_MODE_T tracemode ); virtual void Arc( const wxPoint& centre, int StAngle, int EndAngle, int rayon, - FILL_T fill, int width = -1 ); + FILL_T fill, int width = DEFAULT_LINE_WIDTH ); virtual void PenTo( const wxPoint& pos, char plume ); virtual void FlashPadCircle( const wxPoint& pos, int diametre, EDA_DRAW_MODE_T trace_mode ); @@ -790,4 +844,16 @@ protected: int currentColor; }; +class TITLE_BLOCK; +void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock, + const PAGE_INFO& aPageInfo, + int aSheetNumber, int aNumberOfSheets, + const wxString &aSheetDesc, + const wxString &aFilename ); + +/** Returns the default plot extension for a format + */ +wxString GetDefaultPlotExtension( PlotFormat aFormat ); + + #endif // PLOT_COMMON_H_ diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h index 992669dc51..05cae8b37c 100644 --- a/include/wxBasePcbFrame.h +++ b/include/wxBasePcbFrame.h @@ -91,9 +91,6 @@ protected: /// main window. wxAuiToolBar* m_auxiliaryToolBar; - /// True prints or plots the drawing border and title block. - bool m_printBorderAndTitleBlock; - void updateGridSelectBox(); void updateZoomSelectBox(); virtual void unitsChangeRefresh(); @@ -105,8 +102,6 @@ public: ~PCB_BASE_FRAME(); - bool GetPrintBorderAndTitleBlock() const { return m_printBorderAndTitleBlock; } - /** * Function GetBoardBoundingBox * calculates the bounding box containing all board items (or board edge segments). @@ -569,73 +564,6 @@ public: */ void RecalculateAllTracksNetcode(); - /* Plotting functions: - * Return true if OK, false if the file is not created (or has a problem) - */ - - /** - * Function ExportToGerberFile - * create one output files one per board layer in the RS274X format. - *

- * The units are in inches and in the format 3.4 with the leading zeros omitted. - * Coordinates are absolute value. The 3.4 format is used because the native Pcbnew - * units are 1/10000 inch. - *

- */ - bool ExportToGerberFile( const wxString& aFullFileName, - int aLayer, - bool aPlotOriginIsAuxAxis, - EDA_DRAW_MODE_T aTraceMode ); - - bool ExportToHpglFile( const wxString& aFullFileName, - int aLayer, - EDA_DRAW_MODE_T aTraceMode ); - - bool ExportToPostScriptFile( const wxString& aFullFileName, - int aLayer, - bool aUseA4, - EDA_DRAW_MODE_T aTraceMode ); - - bool ExportToDxfFile( const wxString& aFullFileName, - int aLayer, - EDA_DRAW_MODE_T aTraceMode ); - - void Plot_Layer( PLOTTER* plotter, - int Layer, - EDA_DRAW_MODE_T trace_mode ); - - /** - * Function Plot_Standard_Layer - * plot copper or technical layers. - * not used for silk screen layers, because these layers have specific - * requirements, mainly for pads - * @param aPlotter = the plotter to use - * @param aLayerMask = the mask to define the layers to plot - * @param aPlotVia = true to plot vias, false to skip vias (has meaning - * only for solder mask layers). - * @param aPlotMode = the plot mode (files, sketch). Has meaning for some formats only - * @param aSkipNPTH_Pads = true to skip NPTH Pads, when the pad size and the pad hole - * have the same size. Used in GERBER format only. - */ - void Plot_Standard_Layer( PLOTTER* aPlotter, int aLayerMask, - bool aPlotVia, EDA_DRAW_MODE_T aPlotMode, - bool aSkipNPTH_Pads = false ); - - void PlotSilkScreen( PLOTTER* plotter, int masque_layer, EDA_DRAW_MODE_T trace_mode ); - - /** - * Function PlotDrillMark - * Draw a drill mark for pads and vias. - * Must be called after all drawings, because it - * redraw the drill mark on a pad or via, as a negative (i.e. white) shape - * in FILLED plot mode - * @param aPlotter = the PLOTTER - * @param aTraceMode = the mode of plot (FILLED, SKETCH) - * @param aSmallDrillShape = true to plot a small drill shape, false to - * plot the actual drill shape - */ - void PlotDrillMark( PLOTTER* aPlotter, EDA_DRAW_MODE_T aTraceMode, bool aSmallDrillShape ); - /* Functions relative to Undo/redo commands: */ diff --git a/include/wxstruct.h b/include/wxstruct.h index e1f1359ecf..8e25273b92 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -662,7 +662,8 @@ public: */ double GetZoom(); - void TraceWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWidth, double aScalar ); + void TraceWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWidth, + double aScale, const wxString &aFilename ); /** * Function TraceWorkSheet is a core function for drawing of the page layout with @@ -686,8 +687,6 @@ public: int aNScr, int aScr, int aLnW, double aScalar, EDA_COLOR_T aClr1 = RED, EDA_COLOR_T aClr2 = RED ); - void PlotWorkSheet( PLOTTER* aPlotter, BASE_SCREEN* aScreen, int aLineWidth ); - /** * Function GetXYSheetReferences * returns the X,Y sheet references where the point position is located diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 6cd84b5da6..9410c14e92 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -187,10 +187,6 @@ set(PCBNEW_CLASS_SRCS pcbnew.cpp pcbnew_config.cpp pcbplot.cpp - plotgerb.cpp - plothpgl.cpp - plotps.cpp - plotdxf.cpp plot_rtn.cpp print_board_functions.cpp printout_controler.cpp diff --git a/pcbnew/build_BOM_from_board.cpp b/pcbnew/build_BOM_from_board.cpp index fe6660c426..e8f3474dc0 100644 --- a/pcbnew/build_BOM_from_board.cpp +++ b/pcbnew/build_BOM_from_board.cpp @@ -64,7 +64,7 @@ void PCB_EDIT_FRAME::RecreateBOMFileFromBoard( wxCommandEvent& aEvent ) } /* Set the file extension: */ - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( CsvFileExtension ); wxFileDialog dlg( this, _( "Save Bill of Materials" ), wxGetCwd(), diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index ecf5b49028..b87402aa67 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -187,6 +187,9 @@ class BOARD : public BOARD_ITEM friend class PCB_EDIT_FRAME; private: + /// the board filename + wxString m_fileName; + // @todo: switch to boost:ptr_vector, and change ~BOARD() typedef std::vector MARKERS; @@ -237,6 +240,10 @@ private: public: + void SetFileName( const wxString& aFileName ) { m_fileName = aFileName; } + + const wxString &GetFileName() const { return m_fileName; } + /// Flags used in ratsnest calculation and update. int m_Status_Pcb; diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp index 08ddb1219a..4a03ed178b 100644 --- a/pcbnew/dialogs/dialog_SVG_print.cpp +++ b/pcbnew/dialogs/dialog_SVG_print.cpp @@ -183,7 +183,7 @@ void DIALOG_SVG_PRINT::PrintSVGDoc( bool aPrintAll, bool aPrint_Frame_Ref ) fn = m_FileNameCtrl->GetValue(); if( !fn.IsOk() ) { - fn = screen->GetFileName(); + fn = m_Parent->GetBoard()->GetFileName(); } if( aPrintAll ) @@ -271,7 +271,8 @@ bool DIALOG_SVG_PRINT::DrawPage( const wxString& FullFileName, g_DrawBgColor = WHITE; if( aPrint_Frame_Ref ) - m_Parent->TraceWorkSheet( &dc, screen, s_Parameters.m_PenDefaultSize, IU_PER_MILS ); + m_Parent->TraceWorkSheet( &dc, screen, s_Parameters.m_PenDefaultSize, + IU_PER_MILS, wxT( "" ) ); m_Parent->PrintPage( &dc, m_PrintMaskLayer, false, &s_Parameters); g_DrawBgColor = bg_color; diff --git a/pcbnew/dialogs/dialog_drc.cpp b/pcbnew/dialogs/dialog_drc.cpp index 5e95dfe8d6..69566433a2 100644 --- a/pcbnew/dialogs/dialog_drc.cpp +++ b/pcbnew/dialogs/dialog_drc.cpp @@ -293,7 +293,7 @@ void DIALOG_DRC_CONTROL::OnButtonBrowseRptFileClick( wxCommandEvent& event ) wxString wildcard( _( "DRC report files (.rpt)|*.rpt" ) ); wxString Ext( wxT( "rpt" ) ); - fn = m_Parent->GetScreen()->GetFileName() + wxT( "-drc" ); + fn = m_Parent->GetBoard()->GetFileName() + wxT( "-drc" ); fn.SetExt( Ext ); wxFileDialog dlg( this, _( "Save DRC Report File" ), wxEmptyString, @@ -574,7 +574,7 @@ void DIALOG_DRC_CONTROL::writeReport( FILE* fp ) int count; fprintf( fp, "** Drc report for %s **\n", - TO_UTF8( m_Parent->GetScreen()->GetFileName() ) ); + TO_UTF8( m_Parent->GetBoard()->GetFileName() ) ); wxDateTime now = wxDateTime::Now(); diff --git a/pcbnew/dialogs/dialog_gendrill.cpp b/pcbnew/dialogs/dialog_gendrill.cpp index 606918f243..3f0180d712 100644 --- a/pcbnew/dialogs/dialog_gendrill.cpp +++ b/pcbnew/dialogs/dialog_gendrill.cpp @@ -138,11 +138,11 @@ void DIALOG_GENDRILL::InitDisplayParams() m_MicroViaDrillValue->SetLabel( _( "Use Netclasses values" ) ); msg.Empty(); - msg << plot_opts.m_HPGLPenNum; + msg << plot_opts.GetHPGLPenNum(); m_PenNum->SetValue( msg ); msg.Empty(); - msg << plot_opts.m_HPGLPenSpeed; + msg << plot_opts.GetHPGLPenSpeed(); m_PenSpeed->SetValue( msg ); // See if we have some buried vias or/and microvias, and display @@ -308,12 +308,12 @@ void DIALOG_GENDRILL::SetParams() msg = m_PenSpeed->GetValue(); if( msg.ToLong( <mp ) ) - plot_opts.m_HPGLPenSpeed = ltmp; + plot_opts.SetHPGLPenSpeed( ltmp ); msg = m_PenNum->GetValue(); if( msg.ToLong( <mp ) ) - plot_opts.m_HPGLPenNum = ltmp; + plot_opts.SetHPGLPenNum( ltmp ); if( m_Choice_Drill_Offset->GetSelection() == 0 ) m_FileDrillOffset = wxPoint( 0, 0 ); diff --git a/pcbnew/dialogs/dialog_netlist.cpp b/pcbnew/dialogs/dialog_netlist.cpp index 6c7c07ed47..64e9b38703 100644 --- a/pcbnew/dialogs/dialog_netlist.cpp +++ b/pcbnew/dialogs/dialog_netlist.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -28,7 +29,7 @@ void PCB_EDIT_FRAME::InstallNetlistFrame( wxDC* DC ) if( !fn.FileExists() ) { - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( NetlistFileExtension ); lastNetlistName = fn.GetFullPath(); } @@ -40,10 +41,10 @@ void PCB_EDIT_FRAME::InstallNetlistFrame( wxDC* DC ) // Save project settings if needed. // Project settings are saved in the corresponding .pro file if( lastNetlistName != GetLastNetListRead() && - !GetScreen()->GetFileName().IsEmpty() && + !GetBoard()->GetFileName().IsEmpty() && IsOK(NULL, _("Project config has changed. Save it ?") ) ) { - wxFileName fn = GetScreen()->GetFileName(); + wxFileName fn = GetBoard()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); diff --git a/pcbnew/dialogs/dialog_print_for_modedit.cpp b/pcbnew/dialogs/dialog_print_for_modedit.cpp index 086acd0a77..5b13feb82d 100644 --- a/pcbnew/dialogs/dialog_print_for_modedit.cpp +++ b/pcbnew/dialogs/dialog_print_for_modedit.cpp @@ -191,9 +191,9 @@ void DIALOG_PRINT_FOR_MODEDIT::OnPrintButtonClick( wxCommandEvent& event ) s_Parameters.m_Print_Black_and_White = m_ModeColorOption->GetSelection(); s_Parameters.m_PrintScale = s_ScaleList[m_ScaleOption->GetSelection()]; - plot_opts.m_FineScaleAdjustX = s_Parameters.m_XScaleAdjust; - plot_opts.m_FineScaleAdjustY = s_Parameters.m_YScaleAdjust; - plot_opts.m_PlotScale = s_Parameters.m_PrintScale; + plot_opts.SetFineScaleAdjustX( s_Parameters.m_XScaleAdjust ); + plot_opts.SetFineScaleAdjustY( s_Parameters.m_YScaleAdjust ); + plot_opts.SetScale( s_Parameters.m_PrintScale ); m_parent->SetPlotSettings( plot_opts ); diff --git a/pcbnew/dialogs/dialog_print_using_printer.cpp b/pcbnew/dialogs/dialog_print_using_printer.cpp index 56be0af084..7a64a4d437 100644 --- a/pcbnew/dialogs/dialog_print_using_printer.cpp +++ b/pcbnew/dialogs/dialog_print_using_printer.cpp @@ -353,7 +353,7 @@ void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) int idx = m_ScaleOption->GetSelection(); s_Parameters.m_PrintScale = s_ScaleList[idx]; - plot_opts.m_PlotScale = s_Parameters.m_PrintScale; + plot_opts.SetScale( s_Parameters.m_PrintScale ); if( m_FineAdjustXscaleOpt ) { @@ -371,8 +371,8 @@ void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) m_FineAdjustYscaleOpt->GetValue().ToDouble( &s_Parameters.m_YScaleAdjust ); } - plot_opts.m_FineScaleAdjustX = s_Parameters.m_XScaleAdjust; - plot_opts.m_FineScaleAdjustY = s_Parameters.m_YScaleAdjust; + plot_opts.SetFineScaleAdjustX( s_Parameters.m_XScaleAdjust ); + plot_opts.SetFineScaleAdjustY( s_Parameters.m_YScaleAdjust ); m_parent->SetPlotSettings( plot_opts ); diff --git a/pcbnew/eagle_plugin.cpp b/pcbnew/eagle_plugin.cpp index 69ad4c9415..41efc9012e 100644 --- a/pcbnew/eagle_plugin.cpp +++ b/pcbnew/eagle_plugin.cpp @@ -1101,6 +1101,10 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPE m_board = aAppendToMe ? aAppendToMe : new BOARD(); + // Give the filename to the board if it's new + if( !aAppendToMe ) + m_board->SetFileName( aFileName ); + // delete on exception, iff I own m_board, according to aAppendToMe auto_ptr deleter( aAppendToMe ? NULL : m_board ); diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp index 9ae7d4bef0..37861d53a8 100644 --- a/pcbnew/export_gencad.cpp +++ b/pcbnew/export_gencad.cpp @@ -119,7 +119,7 @@ static double MapYTo( int aY ) /* Driver function: processing starts here */ void PCB_EDIT_FRAME::ExportToGenCAD( wxCommandEvent& aEvent ) { - wxFileName fn = GetScreen()->GetFileName(); + wxFileName fn = GetBoard()->GetFileName(); wxString msg, ext, wildcard; FILE* file; @@ -688,7 +688,7 @@ static void CreateSignalsSection( FILE* aFile, BOARD* aPcb ) static bool CreateHeaderInfoData( FILE* aFile, PCB_EDIT_FRAME* aFrame ) { wxString msg; - PCB_SCREEN* screen = (PCB_SCREEN*) aFrame->GetScreen(); + BOARD *board = aFrame->GetBoard(); fputs( "$HEADER\n", aFile ); fputs( "GENCAD 1.4\n", aFile ); @@ -699,7 +699,7 @@ static bool CreateHeaderInfoData( FILE* aFile, PCB_EDIT_FRAME* aFrame ) GetChars( GetBuildVersion() ) ); fputs( TO_UTF8( msg ), aFile ); - msg = wxT( "DRAWING \"" ) + screen->GetFileName() + wxT( "\"\n" ); + msg = wxT( "DRAWING \"" ) + board->GetFileName() + wxT( "\"\n" ); fputs( TO_UTF8( msg ), aFile ); const TITLE_BLOCK& tb = aFrame->GetTitleBlock(); diff --git a/pcbnew/export_vrml.cpp b/pcbnew/export_vrml.cpp index 093070d2a8..c2c75e9d17 100644 --- a/pcbnew/export_vrml.cpp +++ b/pcbnew/export_vrml.cpp @@ -1197,7 +1197,7 @@ void PCB_EDIT_FRAME::OnExportVRML( wxCommandEvent& event ) // Build default file name wxString ext = wxT( "wrl" ); - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( ext ); DIALOG_EXPORT_3DFILE dlg( this ); diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 9be277668e..70b941ffb5 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -85,7 +85,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) switch( id ) { case ID_LOAD_FILE: - LoadOnePcbFile( GetScreen()->GetFileName(), false, true ); + LoadOnePcbFile( GetBoard()->GetFileName(), false, true ); break; case ID_MENU_READ_LAST_SAVED_VERSION_BOARD: @@ -99,7 +99,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) } else { - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( pcbBackupFileExtension ); } @@ -119,7 +119,9 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) LoadOnePcbFile( fn.GetFullPath(), false ); fn.SetExt( PcbFileExtension ); - GetScreen()->SetFileName( fn.GetFullPath() ); + + // Re-set the name since extension changed + GetBoard()->SetFileName( fn.GetFullPath() ); UpdateTitle(); } break; @@ -129,16 +131,20 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) break; case ID_NEW_BOARD: - Clear_Pcb( true ); - GetScreen()->GetFileName().Printf( wxT( "%s%cnoname%s" ), - GetChars( wxGetCwd() ), DIR_SEP, - GetChars( PcbFileExtension ) ); - UpdateTitle(); - ReCreateLayerBox( NULL ); + { + Clear_Pcb( true ); + wxString newFilename; + newFilename.Printf( wxT( "%s%cnoname%s" ), + GetChars( wxGetCwd() ), DIR_SEP, + GetChars( PcbFileExtension ) ); + GetBoard()->SetFileName( newFilename ); + UpdateTitle(); + ReCreateLayerBox( NULL ); + } break; case ID_SAVE_BOARD: - SavePcbFile( GetScreen()->GetFileName() ); + SavePcbFile( GetBoard()->GetFileName() ); break; case ID_SAVE_BOARD_AS: @@ -163,7 +169,7 @@ the changes?" ) ) ) if( aAppend ) { - GetScreen()->SetFileName( wxEmptyString ); + GetBoard()->SetFileName( wxEmptyString ); OnModify(); GetBoard()->m_Status_Pcb = 0; } @@ -235,7 +241,7 @@ the changes?" ) ) ) CheckForAutoSaveFile( fileName, pcbBackupFileExtension ); - GetScreen()->SetFileName( fileName.GetFullPath() ); + GetBoard()->SetFileName( fileName.GetFullPath() ); if( !aAppend ) { @@ -247,7 +253,7 @@ the changes?" ) ) ) m_DisplayViaFill = DisplayOpt.DisplayViaFill; // load project settings before BOARD, in case BOARD file has overrides. - LoadProjectSettings( GetScreen()->GetFileName() ); + LoadProjectSettings( GetBoard()->GetFileName() ); } else { @@ -264,7 +270,11 @@ the changes?" ) ) ) props["page_height"] = wxString::Format( wxT( "%d" ), GetPageSizeIU().y ); // load or append either: - loadedBoard = pi->Load( GetScreen()->GetFileName(), aAppend ? GetBoard() : NULL, &props ); + loadedBoard = pi->Load( GetBoard()->GetFileName(), aAppend ? GetBoard() : NULL, &props ); + + // the Load plugin method makes a 'fresh' board, so we need to + // set its own name + GetBoard()->SetFileName( fileName.GetFullPath() ); if( !aAppend ) { @@ -301,7 +311,7 @@ this file again." ) ); // If append option: change the initial board name to -append.brd if( aAppend ) { - wxString new_filename = GetScreen()->GetFileName().BeforeLast( '.' ); + wxString new_filename = GetBoard()->GetFileName().BeforeLast( '.' ); if ( ! new_filename.EndsWith( wxT( "-append" ) ) ) new_filename += wxT( "-append" ); @@ -309,13 +319,16 @@ this file again." ) ); new_filename += wxT( "." ) + PcbFileExtension; OnModify(); - GetScreen()->SetFileName( new_filename ); + GetBoard()->SetFileName( new_filename ); } - GetScreen()->GetFileName().Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); + // Fix the directory separator on Windows + wxString fn( GetBoard()->GetFileName() ); + fn.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); + GetBoard()->SetFileName( fn ); UpdateTitle(); - UpdateFileHistory( GetScreen()->GetFileName() ); + UpdateFileHistory( GetBoard()->GetFileName() ); // Rebuild the new pad list (for drc and ratsnet control ...) GetBoard()->m_Status_Pcb = 0; @@ -404,18 +417,18 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF if( aFileName == wxEmptyString ) { - wxFileDialog dlg( this, _( "Save Board File" ), wxEmptyString, GetScreen()->GetFileName(), + wxFileDialog dlg( this, _( "Save Board File" ), wxEmptyString, GetBoard()->GetFileName(), wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); if( dlg.ShowModal() != wxID_OK ) return false; - GetScreen()->SetFileName( dlg.GetPath() ); + GetBoard()->SetFileName( dlg.GetPath() ); wildcardIndex = dlg.GetFilterIndex(); // Legacy or s-expression file format. } else { - GetScreen()->SetFileName( aFileName ); + GetBoard()->SetFileName( aFileName ); } // If changes are made, update the board date @@ -427,7 +440,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF SetTitleBlock( tb ); } - pcbFileName = GetScreen()->GetFileName(); + pcbFileName = GetBoard()->GetFileName(); if( pcbFileName.GetExt().IsEmpty() ) pcbFileName.SetExt( IO_MGR::GetFileExtension( (IO_MGR::PCB_FILE_T) wildcardIndex ) ); @@ -500,7 +513,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF if( saveok ) { - GetScreen()->SetFileName( pcbFileName.GetFullPath() ); + GetBoard()->SetFileName( pcbFileName.GetFullPath() ); UpdateTitle(); } @@ -537,7 +550,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF bool PCB_EDIT_FRAME::doAutoSave() { - wxFileName tmpFileName = GetScreen()->GetFileName(); + wxFileName tmpFileName = GetBoard()->GetFileName(); wxFileName fn = tmpFileName; // Auto save file name is the normal file name prepended with $. @@ -549,13 +562,13 @@ bool PCB_EDIT_FRAME::doAutoSave() if( SavePcbFile( fn.GetFullPath(), NO_BACKUP_FILE ) ) { GetScreen()->SetModify(); - GetScreen()->SetFileName( tmpFileName.GetFullPath() ); + GetBoard()->SetFileName( tmpFileName.GetFullPath() ); UpdateTitle(); m_autoSaveState = false; return true; } - GetScreen()->SetFileName( tmpFileName.GetFullPath() ); + GetBoard()->SetFileName( tmpFileName.GetFullPath() ); return false; } diff --git a/pcbnew/gen_drill_report_files.cpp b/pcbnew/gen_drill_report_files.cpp index db8a73ea24..ca59c0256b 100644 --- a/pcbnew/gen_drill_report_files.cpp +++ b/pcbnew/gen_drill_report_files.cpp @@ -55,18 +55,18 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, case PLOT_FORMAT_GERBER: offset = auxoffset; plotter = new GERBER_PLOTTER(); - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, 0 ); + plotter->SetViewport( offset, IU_PER_DECIMILS, scale, false ); break; case PLOT_FORMAT_HPGL: // Scale for HPGL format. { HPGL_PLOTTER* hpgl_plotter = new HPGL_PLOTTER; plotter = hpgl_plotter; - hpgl_plotter->SetPenNumber( plot_opts.m_HPGLPenNum ); - hpgl_plotter->SetPenSpeed( plot_opts.m_HPGLPenSpeed ); + hpgl_plotter->SetPenNumber( plot_opts.GetHPGLPenNum() ); + hpgl_plotter->SetPenSpeed( plot_opts.GetHPGLPenSpeed() ); hpgl_plotter->SetPenOverlap( 0 ); plotter->SetPageSettings( aSheet ); - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, 0 ); + plotter->SetViewport( offset, IU_PER_DECIMILS, scale, false ); } break; @@ -100,7 +100,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, PS_PLOTTER* ps_plotter = new PS_PLOTTER; plotter = ps_plotter; ps_plotter->SetPageSettings( pageA4 ); - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, 0 ); + plotter->SetViewport( offset, IU_PER_DECIMILS, scale, false ); } break; @@ -109,7 +109,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, DXF_PLOTTER* dxf_plotter = new DXF_PLOTTER; plotter = dxf_plotter; plotter->SetPageSettings( aSheet ); - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, 0 ); + plotter->SetViewport( offset, IU_PER_DECIMILS, scale, false ); } break; @@ -180,7 +180,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, // Plot title "Info" wxString Text = wxT( "Drill Map:" ); - plotter->Text( wxPoint( plotX, plotY ), BLACK, Text, 0, + plotter->Text( wxPoint( plotX, plotY ), UNSPECIFIED, Text, 0, wxSize( (int) ( charSize * charScale ), (int) ( charSize * charScale ) ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, @@ -232,7 +232,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, aToolListBuffer[ii].m_OvalCount ); msg += FROM_UTF8( line ); - plotter->Text( wxPoint( plotX, y ), BLACK, + plotter->Text( wxPoint( plotX, y ), UNSPECIFIED, msg, 0, wxSize( (int) ( charSize * charScale ), (int) ( charSize * charScale ) ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, diff --git a/pcbnew/gen_modules_placefile.cpp b/pcbnew/gen_modules_placefile.cpp index 4e65b009ce..91fbc0cfb6 100644 --- a/pcbnew/gen_modules_placefile.cpp +++ b/pcbnew/gen_modules_placefile.cpp @@ -161,7 +161,7 @@ void DIALOG_GEN_MODULE_POSITION::OnOutputDirectoryBrowseClicked( wxCommandEvent& if( dialog.ShowModal() == wxID_YES ) { - wxString boardFilePath = ( (wxFileName) m_parent->GetScreen()->GetFileName()).GetPath(); + wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName()).GetPath(); if( !dirName.MakeRelativeTo( boardFilePath ) ) wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ), @@ -193,7 +193,6 @@ void DIALOG_GEN_MODULE_POSITION::OnOKButton( wxCommandEvent& event ) bool DIALOG_GEN_MODULE_POSITION::CreateFiles() { BOARD * brd = m_parent->GetBoard(); - PCB_SCREEN * screen = m_parent->GetScreen(); wxFileName fn; wxString msg; wxString frontLayerName; @@ -201,7 +200,7 @@ bool DIALOG_GEN_MODULE_POSITION::CreateFiles() bool singleFile = OneFileOnly(); int fullcount = 0; - fn = screen->GetFileName(); + fn = m_parent->GetBoard()->GetFileName(); fn.SetPath( GetOutputDirectory() ); frontLayerName = brd->GetLayerName( LAYER_N_FRONT ); backLayerName = brd->GetLayerName( LAYER_N_BACK ); @@ -250,7 +249,7 @@ bool DIALOG_GEN_MODULE_POSITION::CreateFiles() // Create the Back or Bottom side placement file fullcount = fpcount; side = 0; - fn = screen->GetFileName(); + fn = brd->GetFileName(); fn.SetPath( GetOutputDirectory() ); fn.SetName( fn.GetName() + wxT( "-" ) + backLayerName ); fn.SetExt( wxT( "pos" ) ); @@ -506,13 +505,13 @@ void PCB_EDIT_FRAME::GenFootprintsReport( wxCommandEvent& event ) { wxFileName fn; - wxString boardFilePath = ( (wxFileName) GetScreen()->GetFileName()).GetPath(); + wxString boardFilePath = ( (wxFileName) GetBoard()->GetFileName()).GetPath(); wxDirDialog dirDialog( this, _( "Select Output Directory" ), boardFilePath ); if( dirDialog.ShowModal() == wxID_CANCEL ) return; - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetPath( dirDialog.GetPath() ); fn.SetExt( wxT( "rpt" ) ); diff --git a/pcbnew/gendrill.cpp b/pcbnew/gendrill.cpp index b75793d878..a14c2f3ae6 100644 --- a/pcbnew/gendrill.cpp +++ b/pcbnew/gendrill.cpp @@ -129,7 +129,7 @@ void DIALOG_GENDRILL::GenDrillAndReportFiles() if( s_ToolListBuffer.size() > 0 ) // holes? { - fn = m_parent->GetScreen()->GetFileName(); + fn = m_parent->GetBoard()->GetFileName(); layer_extend.Empty(); if( gen_NPTH_holes ) @@ -240,7 +240,7 @@ void DIALOG_GENDRILL::GenDrillAndReportFiles() if( m_Choice_Drill_Report->GetSelection() > 0 ) { - fn = m_parent->GetScreen()->GetFileName(); + fn = m_parent->GetBoard()->GetFileName(); GenDrillReport( fn.GetFullName() ); } @@ -607,22 +607,22 @@ void DIALOG_GENDRILL::GenDrillMap( const wxString aFileName, switch( format ) { case PLOT_FORMAT_HPGL: - ext = wxT( "plt" ); + ext = HPGL_PLOTTER::GetDefaultFileExtension(); wildcard = _( "HPGL plot files (.plt)|*.plt" ); break; case PLOT_FORMAT_POST: - ext = wxT( "ps" ); + ext = PS_PLOTTER::GetDefaultFileExtension(); wildcard = _( "PostScript files (.ps)|*.ps" ); break; case PLOT_FORMAT_GERBER: - ext = wxT( "pho" ); + ext = GERBER_PLOTTER::GetDefaultFileExtension(); wildcard = _( "Gerber files (.pho)|*.pho" ); break; case PLOT_FORMAT_DXF: - ext = wxT( "dxf" ); + ext = DXF_PLOTTER::GetDefaultFileExtension(); wildcard = _( "DXF files (.dxf)|*.dxf" ); break; @@ -693,7 +693,7 @@ void DIALOG_GENDRILL::GenDrillReport( const wxString aFileName ) } GenDrillReportFile( report_dest, m_parent->GetBoard(), - m_parent->GetScreen()->GetFileName(), + m_parent->GetBoard()->GetFileName(), m_UnitDrillIsInch, s_HoleListBuffer, s_ToolListBuffer ); diff --git a/pcbnew/initpcb.cpp b/pcbnew/initpcb.cpp index f9c44ba04d..5d180ab66c 100644 --- a/pcbnew/initpcb.cpp +++ b/pcbnew/initpcb.cpp @@ -51,7 +51,7 @@ bool PCB_EDIT_FRAME::Clear_Pcb( bool aQuery ) SetCurItem( NULL ); // clear filename, to avoid overwriting an old file - GetScreen()->GetFileName().Empty(); + GetBoard()->SetFileName( wxEmptyString ); // preserve grid size accross call to InitDataPoints() @@ -101,7 +101,7 @@ bool FOOTPRINT_EDIT_FRAME::Clear_Pcb( bool aQuery ) GetBoard()->m_Modules.DeleteAll(); // init pointeurs et variables - GetScreen()->GetFileName().Empty(); + GetBoard()->SetFileName( wxEmptyString ); SetCurItem( NULL ); diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 9c3e65dc71..1d1c3dab6e 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -1204,5 +1204,11 @@ BOARD* PCB_IO::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPERTIES* PCB_PARSER parser( new FILE_LINE_READER( file.fp(), aFileName ), aAppendToMe ); - return (BOARD*) parser.Parse(); + BOARD* board = dynamic_cast( parser.Parse() ); + wxASSERT( board ); + + // Give the filename to the board if it's new + if( !aAppendToMe ) + board->SetFileName( aFileName ); + return board; } diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp index 676b376c36..747a833f43 100644 --- a/pcbnew/legacy_plugin.cpp +++ b/pcbnew/legacy_plugin.cpp @@ -232,6 +232,10 @@ BOARD* LEGACY_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPE m_board = aAppendToMe ? aAppendToMe : new BOARD(); + // Give the filename to the board if it's new + if( !aAppendToMe ) + m_board->SetFileName( aFileName ); + // delete on exception, iff I own m_board, according to aAppendToMe auto_ptr deleter( aAppendToMe ? NULL : m_board ); diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index 01baac3c16..8d1e33094a 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -472,7 +472,7 @@ void PCB_PARSER::parseGeneralSection() throw( IO_ERROR, PARSE_ERROR ) break; default: // Skip everything but the board thickness. - wxLogDebug( wxT( "Skipping general section token %s " ), GetTokenString( token ) ); + wxLogDebug( wxT( "Skipping general section token %s " ), GetChars( GetTokenString( token ) ) ); while( ( token = NextTok() ) != T_RIGHT ) { @@ -1676,7 +1676,7 @@ TEXTE_MODULE* PCB_PARSER::parseTEXTE_MODULE() throw( IO_ERROR, PARSE_ERROR ) { wxCHECK_MSG( CurTok() == T_fp_text, NULL, wxString::Format( wxT( "Cannot parse %s as TEXTE_MODULE at line %d, offset %d." ), - GetTokenString( CurTok() ), CurLineNumber(), CurOffset() ) ); + GetChars( GetTokenString( CurTok() ) ), CurLineNumber(), CurOffset() ) ); T token = NextTok(); diff --git a/pcbnew/pcb_plot_params.cpp b/pcbnew/pcb_plot_params.cpp index bf601d5992..2830a88a63 100644 --- a/pcbnew/pcb_plot_params.cpp +++ b/pcbnew/pcb_plot_params.cpp @@ -73,47 +73,49 @@ static bool setInt( int* aInt, int aValue, int aMin, int aMax ) return (temp == aValue); } - // PCB_PLOT_PARAMS PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() { - layerSelection = LAYER_BACK | LAYER_FRONT + m_layerSelection = LAYER_BACK | LAYER_FRONT | SILKSCREEN_LAYER_FRONT | SILKSCREEN_LAYER_BACK; - useGerberExtensions = true; - m_SkipNPTH_Pads = false; - m_ExcludeEdgeLayer = true; - m_PlotLineWidth = g_DrawDefaultLineThickness; - m_PlotFrameRef = false; - m_PlotViaOnMaskLayer = false; - m_PlotMode = FILLED; - useAuxOrigin = false; + m_useGerberExtensions = true; + m_excludeEdgeLayer = true; + m_lineWidth = g_DrawDefaultLineThickness; + m_plotFrameRef = false; + m_plotViaOnMaskLayer = false; + m_mode = FILLED; + m_useAuxOrigin = false; m_HPGLPenNum = 1; m_HPGLPenSpeed = 20; // this param is always in cm/s m_HPGLPenDiam = 15; // in mils m_HPGLPenOvr = 2; // in mils - m_PlotPSColorOpt = true; - m_PlotPSNegative = false; - psA4Output = false; - m_PlotReference = true; - m_PlotValue = true; - m_PlotTextOther = true; - m_PlotInvisibleTexts = false; - m_PlotPadsOnSilkLayer = false; - subtractMaskFromSilk = false; - m_PlotFormat = PLOT_FORMAT_GERBER; - m_PlotMirror = false; - m_DrillShapeOpt = SMALL_DRILL_SHAPE; - m_AutoScale = false; - m_PlotScale = 1.0; - scaleSelection = 1; - m_FineScaleAdjustX = 1.0; - m_FineScaleAdjustY = 1.0; - m_FineWidthAdjust = 0.; - outputDirectory = wxT( "" ); + m_negative = false; + m_A4Output = false; + m_plotReference = true; + m_plotValue = true; + m_plotOtherText = true; + m_plotInvisibleText = false; + m_plotPadsOnSilkLayer = false; + m_subtractMaskFromSilk = false; + m_format = PLOT_FORMAT_GERBER; + m_mirror = false; + m_drillMarks = SMALL_DRILL_SHAPE; + m_autoScale = false; + m_scale = 1.0; + m_scaleSelection = 1; + m_fineScaleAdjustX = 1.0; + m_fineScaleAdjustY = 1.0; + m_widthAdjust = 0.; + m_outputDirectory.clear(); + m_color = BLACK; + m_referenceColor = BLACK; + m_valueColor = BLACK; + m_textMode = PLOTTEXTMODE_PHANTOM; } +// PLEASE NOTE: only plot dialog options are processed void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControl ) const throw( IO_ERROR ) { @@ -122,21 +124,21 @@ void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter, aFormatter->Print( aNestLevel, "(%s\n", getTokenName( T_pcbplotparams ) ); aFormatter->Print( aNestLevel+1, "(%s %ld)\n", getTokenName( T_layerselection ), - layerSelection ); + long(m_layerSelection) ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_usegerberextensions ), - useGerberExtensions ? trueStr : falseStr ); + m_useGerberExtensions ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_excludeedgelayer ), - m_ExcludeEdgeLayer ? trueStr : falseStr ); + m_excludeEdgeLayer ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_linewidth ), - m_PlotLineWidth ); + m_lineWidth ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotframeref ), - m_PlotFrameRef ? trueStr : falseStr ); + m_plotFrameRef ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_viasonmask ), - m_PlotViaOnMaskLayer ? trueStr : falseStr ); + m_plotViaOnMaskLayer ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_mode ), - m_PlotMode ); + m_mode ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_useauxorigin ), - useAuxOrigin ? trueStr : falseStr ); + m_useAuxOrigin ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpennumber ), m_HPGLPenNum ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenspeed ), @@ -145,34 +147,32 @@ void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter, m_HPGLPenDiam ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_hpglpenoverlay ), m_HPGLPenOvr ); - aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_pscolor ), - m_PlotPSColorOpt ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psnegative ), - m_PlotPSNegative ? trueStr : falseStr ); + m_negative ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_psa4output ), - psA4Output ? trueStr : falseStr ); + m_A4Output ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotreference ), - m_PlotReference ? trueStr : falseStr ); + m_plotReference ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotvalue ), - m_PlotValue ? trueStr : falseStr ); + m_plotValue ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotothertext ), - m_PlotTextOther ? trueStr : falseStr ); + m_plotOtherText ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_plotinvisibletext ), - m_PlotInvisibleTexts ? trueStr : falseStr ); + m_plotInvisibleText ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_padsonsilk ), - m_PlotPadsOnSilkLayer ? trueStr : falseStr ); + m_plotPadsOnSilkLayer ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_subtractmaskfromsilk ), - subtractMaskFromSilk ? trueStr : falseStr ); + m_subtractMaskFromSilk ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_outputformat ), - m_PlotFormat ); + m_format ); aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_mirror ), - m_PlotMirror ? trueStr : falseStr ); + m_mirror ? trueStr : falseStr ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_drillshape ), - m_DrillShapeOpt ); + m_drillMarks ); aFormatter->Print( aNestLevel+1, "(%s %d)\n", getTokenName( T_scaleselection ), - scaleSelection ); + m_scaleSelection ); aFormatter->Print( aNestLevel+1, "(%s %s)", getTokenName( T_outputdirectory ), - aFormatter->Quotew( outputDirectory ).c_str() ); + aFormatter->Quotew( m_outputDirectory ).c_str() ); aFormatter->Print( 0, ")\n" ); } @@ -185,21 +185,21 @@ void PCB_PLOT_PARAMS::Parse( PCB_PLOT_PARAMS_PARSER* aParser ) throw( IO_ERROR, bool PCB_PLOT_PARAMS::operator==( const PCB_PLOT_PARAMS &aPcbPlotParams ) const { - if( layerSelection != aPcbPlotParams.layerSelection ) + if( m_layerSelection != aPcbPlotParams.m_layerSelection ) return false; - if( useGerberExtensions != aPcbPlotParams.useGerberExtensions ) + if( m_useGerberExtensions != aPcbPlotParams.m_useGerberExtensions ) return false; - if( m_ExcludeEdgeLayer != aPcbPlotParams.m_ExcludeEdgeLayer ) + if( m_excludeEdgeLayer != aPcbPlotParams.m_excludeEdgeLayer ) return false; - if( m_PlotLineWidth != aPcbPlotParams.m_PlotLineWidth ) + if( m_lineWidth != aPcbPlotParams.m_lineWidth ) return false; - if( m_PlotFrameRef != aPcbPlotParams.m_PlotFrameRef ) + if( m_plotFrameRef != aPcbPlotParams.m_plotFrameRef ) return false; - if( m_PlotViaOnMaskLayer != aPcbPlotParams.m_PlotViaOnMaskLayer ) + if( m_plotViaOnMaskLayer != aPcbPlotParams.m_plotViaOnMaskLayer ) return false; - if( m_PlotMode != aPcbPlotParams.m_PlotMode ) + if( m_mode != aPcbPlotParams.m_mode ) return false; - if( useAuxOrigin != aPcbPlotParams.useAuxOrigin ) + if( m_useAuxOrigin != aPcbPlotParams.m_useAuxOrigin ) return false; if( m_HPGLPenNum != aPcbPlotParams.m_HPGLPenNum ) return false; @@ -209,33 +209,49 @@ bool PCB_PLOT_PARAMS::operator==( const PCB_PLOT_PARAMS &aPcbPlotParams ) const return false; if( m_HPGLPenOvr != aPcbPlotParams.m_HPGLPenOvr ) return false; - if( m_PlotPSColorOpt != aPcbPlotParams.m_PlotPSColorOpt ) + if( m_negative != aPcbPlotParams.m_negative ) return false; - if( m_PlotPSNegative != aPcbPlotParams.m_PlotPSNegative ) + if( m_A4Output != aPcbPlotParams.m_A4Output ) return false; - if( psA4Output != aPcbPlotParams.psA4Output ) + if( m_plotReference != aPcbPlotParams.m_plotReference ) return false; - if( m_PlotReference != aPcbPlotParams.m_PlotReference ) + if( m_plotValue != aPcbPlotParams.m_plotValue ) return false; - if( m_PlotValue != aPcbPlotParams.m_PlotValue ) + if( m_plotOtherText != aPcbPlotParams.m_plotOtherText ) return false; - if( m_PlotTextOther != aPcbPlotParams.m_PlotTextOther ) + if( m_plotInvisibleText != aPcbPlotParams.m_plotInvisibleText ) return false; - if( m_PlotInvisibleTexts != aPcbPlotParams.m_PlotInvisibleTexts ) + if( m_plotPadsOnSilkLayer != aPcbPlotParams.m_plotPadsOnSilkLayer ) return false; - if( m_PlotPadsOnSilkLayer != aPcbPlotParams.m_PlotPadsOnSilkLayer ) + if( m_subtractMaskFromSilk != aPcbPlotParams.m_subtractMaskFromSilk ) return false; - if( subtractMaskFromSilk != aPcbPlotParams.subtractMaskFromSilk ) + if( m_format != aPcbPlotParams.m_format ) return false; - if( m_PlotFormat != aPcbPlotParams.m_PlotFormat ) + if( m_mirror != aPcbPlotParams.m_mirror ) return false; - if( m_PlotMirror != aPcbPlotParams.m_PlotMirror ) + if( m_drillMarks != aPcbPlotParams.m_drillMarks ) return false; - if( m_DrillShapeOpt != aPcbPlotParams.m_DrillShapeOpt ) + if( m_scaleSelection != aPcbPlotParams.m_scaleSelection ) return false; - if( scaleSelection != aPcbPlotParams.scaleSelection ) + if( m_autoScale != aPcbPlotParams.m_autoScale ) return false; - if( !outputDirectory.IsSameAs( aPcbPlotParams.outputDirectory ) ) + if( m_scale != aPcbPlotParams.m_scale ) + return false; + if( m_fineScaleAdjustX != aPcbPlotParams.m_fineScaleAdjustX ) + return false; + if( m_fineScaleAdjustY != aPcbPlotParams.m_fineScaleAdjustY ) + return false; + if( m_widthAdjust != aPcbPlotParams.m_widthAdjust ) + return false; + if( m_color != aPcbPlotParams.m_color ) + return false; + if( m_referenceColor != aPcbPlotParams.m_referenceColor ) + return false; + if( m_valueColor != aPcbPlotParams.m_valueColor ) + return false; + if( m_textMode != aPcbPlotParams.m_textMode ) + return false; + if( !m_outputDirectory.IsSameAs( aPcbPlotParams.m_outputDirectory ) ) return false; return true; } @@ -247,30 +263,29 @@ bool PCB_PLOT_PARAMS::operator!=( const PCB_PLOT_PARAMS &aPcbPlotParams ) const } -bool PCB_PLOT_PARAMS::SetHpglPenDiameter( int aValue ) +bool PCB_PLOT_PARAMS::SetHPGLPenDiameter( int aValue ) { return setInt( &m_HPGLPenDiam, aValue, HPGL_PEN_DIAMETER_MIN, HPGL_PEN_DIAMETER_MAX ); } -bool PCB_PLOT_PARAMS::SetHpglPenSpeed( int aValue ) +bool PCB_PLOT_PARAMS::SetHPGLPenSpeed( int aValue ) { return setInt( &m_HPGLPenSpeed, aValue, HPGL_PEN_SPEED_MIN, HPGL_PEN_SPEED_MAX ); } -bool PCB_PLOT_PARAMS::SetHpglPenOverlay( int aValue ) +bool PCB_PLOT_PARAMS::SetHPGLPenOverlay( int aValue ) { return setInt( &m_HPGLPenOvr, aValue, HPGL_PEN_OVERLAP_MIN, HPGL_PEN_OVERLAP_MAX ); } -bool PCB_PLOT_PARAMS::SetPlotLineWidth( int aValue ) +bool PCB_PLOT_PARAMS::SetLineWidth( int aValue ) { - return setInt( &m_PlotLineWidth, aValue, PLOT_LINEWIDTH_MIN, PLOT_LINEWIDTH_MAX ); + return setInt( &m_lineWidth, aValue, PLOT_LINEWIDTH_MIN, PLOT_LINEWIDTH_MAX ); } - // PCB_PLOT_PARAMS_PARSER PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER( LINE_READER* aReader ) : @@ -305,32 +320,32 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) throw( IO_ token = NextTok(); if( token != T_NUMBER ) Expecting( T_NUMBER ); - aPcbPlotParams->layerSelection = atol( CurText() ); + aPcbPlotParams->m_layerSelection = atol( CurText() ); break; case T_usegerberextensions: - aPcbPlotParams->useGerberExtensions = ParseBool(); + aPcbPlotParams->m_useGerberExtensions = ParseBool(); break; case T_psa4output: - aPcbPlotParams->psA4Output = ParseBool(); + aPcbPlotParams->m_A4Output = ParseBool(); break; case T_excludeedgelayer: - aPcbPlotParams->m_ExcludeEdgeLayer = ParseBool(); + aPcbPlotParams->m_excludeEdgeLayer = ParseBool(); break; case T_linewidth: - aPcbPlotParams->m_PlotLineWidth = ParseInt( PLOT_LINEWIDTH_MIN, + aPcbPlotParams->m_lineWidth = ParseInt( PLOT_LINEWIDTH_MIN, PLOT_LINEWIDTH_MAX ); break; case T_plotframeref: - aPcbPlotParams->m_PlotFrameRef = ParseBool(); + aPcbPlotParams->m_plotFrameRef = ParseBool(); break; case T_viasonmask: - aPcbPlotParams->m_PlotViaOnMaskLayer = ParseBool(); + aPcbPlotParams->m_plotViaOnMaskLayer = ParseBool(); break; case T_mode: - aPcbPlotParams->m_PlotMode = (EDA_DRAW_MODE_T)ParseInt( 0, 2 ); + aPcbPlotParams->m_mode = static_cast( ParseInt( 0, 2 ) ); break; case T_useauxorigin: - aPcbPlotParams->useAuxOrigin = ParseBool(); + aPcbPlotParams->m_useAuxOrigin = ParseBool(); break; case T_hpglpennumber: aPcbPlotParams->m_HPGLPenNum = ParseInt( HPGL_PEN_NUMBER_MIN, @@ -349,44 +364,44 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) throw( IO_ HPGL_PEN_OVERLAP_MAX ); break; case T_pscolor: - aPcbPlotParams->m_PlotPSColorOpt = ParseBool(); + NeedSYMBOL(); // This actually was never used... break; case T_psnegative: - aPcbPlotParams->m_PlotPSNegative = ParseBool(); + aPcbPlotParams->m_negative = ParseBool(); break; case T_plotreference: - aPcbPlotParams->m_PlotReference = ParseBool(); + aPcbPlotParams->m_plotReference = ParseBool(); break; case T_plotvalue: - aPcbPlotParams->m_PlotValue = ParseBool(); + aPcbPlotParams->m_plotValue = ParseBool(); break; case T_plotothertext: - aPcbPlotParams->m_PlotTextOther = ParseBool(); + aPcbPlotParams->m_plotOtherText = ParseBool(); break; case T_plotinvisibletext: - aPcbPlotParams->m_PlotInvisibleTexts = ParseBool(); + aPcbPlotParams->m_plotInvisibleText = ParseBool(); break; case T_padsonsilk: - aPcbPlotParams->m_PlotPadsOnSilkLayer= ParseBool(); + aPcbPlotParams->m_plotPadsOnSilkLayer= ParseBool(); break; case T_subtractmaskfromsilk: - aPcbPlotParams->subtractMaskFromSilk = ParseBool(); + aPcbPlotParams->m_subtractMaskFromSilk = ParseBool(); break; case T_outputformat: - aPcbPlotParams->m_PlotFormat = ParseInt( 0, 3 ); + aPcbPlotParams->m_format = static_cast( ParseInt( 0, 3 ) ); break; case T_mirror: - aPcbPlotParams->m_PlotMirror = ParseBool(); + aPcbPlotParams->m_mirror = ParseBool(); break; case T_drillshape: - aPcbPlotParams->m_DrillShapeOpt = (PCB_PLOT_PARAMS::DrillShapeOptT) ParseInt( 0, 2 ); + aPcbPlotParams->m_drillMarks = static_cast( ParseInt( 0, 2 ) ); break; case T_scaleselection: - aPcbPlotParams->scaleSelection = ParseInt( 0, 4 ); + aPcbPlotParams->m_scaleSelection = ParseInt( 0, 4 ); break; case T_outputdirectory: NeedSYMBOL(); - aPcbPlotParams->outputDirectory = FROM_UTF8( CurText() ); + aPcbPlotParams->m_outputDirectory = FROM_UTF8( CurText() ); break; default: Unexpected( CurText() ); diff --git a/pcbnew/pcb_plot_params.h b/pcbnew/pcb_plot_params.h index b7676ab8a0..ce6e1d3c37 100644 --- a/pcbnew/pcb_plot_params.h +++ b/pcbnew/pcb_plot_params.h @@ -26,6 +26,8 @@ #include #include #include // EDA_DRAW_MODE_T +#include +#include class PCB_PLOT_PARAMS_PARSER; class LINE_READER; @@ -39,64 +41,110 @@ class PCB_PLOT_PARAMS { friend class PCB_PLOT_PARAMS_PARSER; public: - bool m_ExcludeEdgeLayer; ///< True: do not plot edge layer when plotting other layers - ///< False: Edge layer always plotted (merged) when plotting other layers - int m_PlotLineWidth; - bool m_PlotFrameRef; ///< True to plot/print frame references - bool m_PlotViaOnMaskLayer; ///< True if vias are drawn on Mask layer - ///< (ie protected by mask) - EDA_DRAW_MODE_T m_PlotMode; ///< LINE, FILLED or SKETCH: select how to plot filled objects. - ///< depending on plot format or layers, all options are not always allowed - int m_HPGLPenNum; ///< HPGL only: pen number selection(1 to 9) - int m_HPGLPenSpeed; ///< HPGL only: pen speed, always in cm/s (1 to 99 cm/s) - int m_HPGLPenDiam; ///< HPGL only: pen diameter in MILS, usefull to fill areas - int m_HPGLPenOvr; ///< HPGL only: pen overlay in MILS, usefull only to fill areas - int m_PlotPSColorOpt; ///< True for color Postscript output - bool m_PlotPSNegative; ///< True to create a negative board ps plot - - // Flags to enable or disable ploting of various PCB elements. - - bool m_SkipNPTH_Pads; ///< true to disable plot NPTH pads if hole and size have same value - ///< GERBER only - bool m_PlotReference; - bool m_PlotValue; - bool m_PlotTextOther; - bool m_PlotInvisibleTexts; - bool m_PlotPadsOnSilkLayer; ///< allows pads outlines on silkscreen layer (when pads are also o, silk screen - - int m_PlotFormat; ///< id for plot format (see enum PlotFormat in plot_common.h) */ - bool m_PlotMirror; - - enum DrillShapeOptT { + enum DrillMarksType { NO_DRILL_SHAPE = 0, SMALL_DRILL_SHAPE = 1, FULL_DRILL_SHAPE = 2 }; - DrillShapeOptT m_DrillShapeOpt; ///< For postscript output: holes can be not plotted, - ///< or have a small size or plotted with their actual size - bool m_AutoScale; ///< If true, use the better scale to fit in page - double m_PlotScale; ///< The global scale factor. a 1.0 scale factor plot a board - ///< with its actual size. - - // These next two scale factors are intended to compensable plotters (and mainly printers) X and Y scale error. - // Therefore they are expected very near 1.0 - // Only X and Y dimensions are adjusted: circles are plotted as circle, even if X and Y fine scale differ. - - double m_FineScaleAdjustX; ///< fine scale adjust X axis - double m_FineScaleAdjustY; ///< dine scale adjust Y axis - - /// This width factor is intended to compensate printers and plotters that do - /// not strictly obey line width settings. - double m_FineWidthAdjust; private: - long layerSelection; - bool useGerberExtensions; - bool useAuxOrigin; - bool subtractMaskFromSilk; - bool psA4Output; - int scaleSelection; - wxString outputDirectory; + /** LINE, FILLED or SKETCH selects how to plot filled objects. + * FILLED is not available with all drivers */ + EDA_DRAW_MODE_T m_mode; + + /// Plot format type (chooses the driver to be used) + PlotFormat m_format; + + /// Holes can be not plotted, have a small mark or plotted in actual size + DrillMarksType m_drillMarks; + + /// Choose how represent text with PS, PDF and DXF drivers + PlotTextMode m_textMode; + + /// The default line width (used for the frame and in LINE mode) + int m_lineWidth; + + /// When true set the scale to fit the board in the page + bool m_autoScale; + + /// Global scale factor, 1.0 plots a board with its actual size. + double m_scale; + + /// Mirror the plot around the X axis + bool m_mirror; + + /// Plot in negative color (supported only by some drivers) + bool m_negative; + + /// True if vias are drawn on Mask layer (ie untented, *exposed* by mask) + bool m_plotViaOnMaskLayer; + + /// True to plot/print frame references + bool m_plotFrameRef; + + /// If false always plot (merge) the pcb edge layer on other layers + bool m_excludeEdgeLayer; + + /// Set of layers to plot + long m_layerSelection; + + /** When plotting gerbers use a conventional set of extensions instead of + * appending a suffix to the board name */ + bool m_useGerberExtensions; + + /// Plot gerbers using auxiliary (drill) origin instead of page coordinates + bool m_useAuxOrigin; + + /// On gerbers 'scrape' away the solder mask from silkscreen (trim silks) + bool m_subtractMaskFromSilk; + + /// Autoscale the plot to fit an A4 (landscape?) sheet + bool m_A4Output; + + /// Scale ratio index (UI only) + int m_scaleSelection; + + /// Output directory for plot files (usually relative to the board file) + wxString m_outputDirectory; + + /// Enable plotting of part references + bool m_plotReference; + + /// Enable plotting of part values + bool m_plotValue; + + /// Enable plotting of other fields + bool m_plotOtherText; + + /// Force plotting of fields marked invisible + bool m_plotInvisibleText; + + /// Allows pads outlines on silkscreen layer + /// (when pads are also on silk screen) + bool m_plotPadsOnSilkLayer; + + /* These next two scale factors are intended to compensate plotters + * (mainly printers) X and Y scale error. Therefore they are expected very + * near 1.0; only X and Y dimensions are adjusted: circles are plotted as + * circles, even if X and Y fine scale differ; because of this it is mostly + * useful for printers: postscript plots would be best adjusted using + * the prologue (that would change the whole output matrix */ + + double m_fineScaleAdjustX; ///< fine scale adjust X axis + double m_fineScaleAdjustY; ///< fine scale adjust Y axis + + /** This width factor is intended to compensate printers and plotters that do + * not strictly obey line width settings. Only used for pads and zone + * filling AFAIK */ + double m_widthAdjust; + + int m_HPGLPenNum; ///< HPGL only: pen number selection(1 to 9) + int m_HPGLPenSpeed; ///< HPGL only: pen speed, always in cm/s (1 to 99 cm/s) + int m_HPGLPenDiam; ///< HPGL only: pen diameter in MILS, useful to fill areas + int m_HPGLPenOvr; ///< HPGL only: pen overlay in MILS, useful only to fill areas + EDA_COLOR_T m_color; ///< Color for plotting the current layer + EDA_COLOR_T m_referenceColor; ///< Color for plotting references + EDA_COLOR_T m_valueColor; ///< Color for plotting values public: PCB_PLOT_PARAMS(); @@ -107,31 +155,76 @@ public: bool operator==( const PCB_PLOT_PARAMS &aPcbPlotParams ) const; bool operator!=( const PCB_PLOT_PARAMS &aPcbPlotParams ) const; - void SetPlotFormat( int aFormat ) { m_PlotFormat = aFormat; }; - int GetPlotFormat() const { return m_PlotFormat; }; - void SetOutputDirectory( wxString aDir ) { outputDirectory = aDir; }; - wxString GetOutputDirectory() const { return outputDirectory; }; - void SetUseGerberExtensions( bool aUse ) { useGerberExtensions = aUse; }; - bool GetUseGerberExtensions() const { return useGerberExtensions; }; - void SetSubtractMaskFromSilk( bool aSubtract ) { subtractMaskFromSilk = aSubtract; }; - bool GetSubtractMaskFromSilk() const { return subtractMaskFromSilk; }; - void SetLayerSelection( long aSelection ) { layerSelection = aSelection; }; - long GetLayerSelection() const { return layerSelection; }; - void SetUseAuxOrigin( bool aAux ) { useAuxOrigin = aAux; }; - bool GetUseAuxOrigin() const { return useAuxOrigin; }; - void SetScaleSelection( int aSelection ) { scaleSelection = aSelection; }; - int GetScaleSelection() const { return scaleSelection; }; - void SetPsA4Output( int aForce ) { psA4Output = aForce; }; - bool GetPsA4Output() const { return psA4Output; }; + void SetColor( EDA_COLOR_T aVal ) { m_color = aVal; } + EDA_COLOR_T GetColor() const { return m_color; } + void SetReferenceColor( EDA_COLOR_T aVal ) { m_referenceColor = aVal; } + EDA_COLOR_T GetReferenceColor() const { return m_referenceColor; } + void SetValueColor( EDA_COLOR_T aVal ) { m_valueColor = aVal; } + EDA_COLOR_T GetValueColor() const { return m_valueColor; } + void SetTextMode( PlotTextMode aVal ) { m_textMode = aVal; } + PlotTextMode GetTextMode() const { return m_textMode; } + void SetMode( EDA_DRAW_MODE_T aVal ) { m_mode = aVal; } + EDA_DRAW_MODE_T GetMode() const { return m_mode; } + void SetDrillMarksType( DrillMarksType aVal ) { m_drillMarks = aVal; } + DrillMarksType GetDrillMarksType() const { return m_drillMarks; } + void SetScale( double aVal ) { m_scale = aVal; } + double GetScale() const { return m_scale; } + void SetFineScaleAdjustX( double aVal ) { m_fineScaleAdjustX = aVal; } + double GetFineScaleAdjustX() const { return m_fineScaleAdjustX; } + void SetFineScaleAdjustY( double aVal ) { m_fineScaleAdjustY = aVal; } + double GetFineScaleAdjustY() const { return m_fineScaleAdjustY; } + void SetWidthAdjust( double aVal ) { m_widthAdjust = aVal; } + double GetWidthAdjust() const { return m_widthAdjust; } + void SetAutoScale( bool aFlag ) { m_autoScale = aFlag; } + bool GetAutoScale() const { return m_autoScale; } + void SetMirror( bool aFlag ) { m_mirror = aFlag; } + bool GetMirror() const { return m_mirror; } + void SetPlotPadsOnSilkLayer( bool aFlag ) { m_plotPadsOnSilkLayer = aFlag; } + bool GetPlotPadsOnSilkLayer() const { return m_plotPadsOnSilkLayer; } + void SetPlotInvisibleText( bool aFlag ) { m_plotInvisibleText = aFlag; } + bool GetPlotInvisibleText() const { return m_plotInvisibleText; } + void SetPlotOtherText( bool aFlag ) { m_plotOtherText = aFlag; } + bool GetPlotOtherText() const { return m_plotOtherText; } + void SetPlotValue( bool aFlag ) { m_plotValue = aFlag; } + bool GetPlotValue() const { return m_plotValue; } + void SetPlotReference( bool aFlag ) { m_plotReference = aFlag; } + bool GetPlotReference() const { return m_plotReference; } + void SetNegative( bool aFlag ) { m_negative = aFlag; } + bool GetNegative() const { return m_negative; } + void SetPlotViaOnMaskLayer( bool aFlag ) { m_plotViaOnMaskLayer = aFlag; } + bool GetPlotViaOnMaskLayer() const { return m_plotViaOnMaskLayer; } + void SetPlotFrameRef( bool aFlag ) { m_plotFrameRef = aFlag; } + bool GetPlotFrameRef() const { return m_plotFrameRef; } + void SetExcludeEdgeLayer( bool aFlag ) { m_excludeEdgeLayer = aFlag; } + bool GetExcludeEdgeLayer() const { return m_excludeEdgeLayer; } + void SetFormat( PlotFormat aFormat ) { m_format = aFormat; }; + PlotFormat GetFormat() const { return m_format; }; + void SetOutputDirectory( wxString aDir ) { m_outputDirectory = aDir; }; + wxString GetOutputDirectory() const { return m_outputDirectory; }; + void SetUseGerberExtensions( bool aUse ) { m_useGerberExtensions = aUse; }; + bool GetUseGerberExtensions() const { return m_useGerberExtensions; }; + void SetSubtractMaskFromSilk( bool aSubtract ) { m_subtractMaskFromSilk = aSubtract; }; + bool GetSubtractMaskFromSilk() const { return m_subtractMaskFromSilk; }; + void SetLayerSelection( long aSelection ) + { m_layerSelection = aSelection; }; + long GetLayerSelection() const { return m_layerSelection; }; + void SetUseAuxOrigin( bool aAux ) { m_useAuxOrigin = aAux; }; + bool GetUseAuxOrigin() const { return m_useAuxOrigin; }; + void SetScaleSelection( int aSelection ) { m_scaleSelection = aSelection; }; + int GetScaleSelection() const { return m_scaleSelection; }; + void SetA4Output( int aForce ) { m_A4Output = aForce; }; + bool GetA4Output() const { return m_A4Output; }; - int GetHpglPenDiameter() const { return m_HPGLPenDiam; }; - bool SetHpglPenDiameter( int aValue ); - int GetHpglPenSpeed() const { return m_HPGLPenSpeed; }; - bool SetHpglPenSpeed( int aValue ); - int GetHpglPenOverlay() const { return m_HPGLPenOvr; }; - bool SetHpglPenOverlay( int aValue ); - int GetPlotLineWidth() const { return m_PlotLineWidth; }; - bool SetPlotLineWidth( int aValue ); + int GetHPGLPenDiameter() const { return m_HPGLPenDiam; }; + bool SetHPGLPenDiameter( int aValue ); + int GetHPGLPenSpeed() const { return m_HPGLPenSpeed; }; + bool SetHPGLPenSpeed( int aValue ); + int GetHPGLPenOverlay() const { return m_HPGLPenOvr; }; + bool SetHPGLPenOverlay( int aValue ); + void SetHPGLPenNum( int aVal ) { m_HPGLPenNum = aVal; } + int GetHPGLPenNum() const { return m_HPGLPenNum; } + int GetLineWidth() const { return m_lineWidth; }; + bool SetLineWidth( int aValue ); }; diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index 087de07bbe..119a80cc5a 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -482,7 +482,7 @@ void PCB_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event ) { wxString msg; msg.Printf( _("Save the changes in\n<%s>\nbefore closing?"), - GetChars( GetScreen()->GetFileName() ) ); + GetChars( GetBoard()->GetFileName() ) ); int ii = DisplayExitDialog( this, msg ); switch( ii ) @@ -496,13 +496,13 @@ void PCB_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event ) case wxID_OK: case wxID_YES: - SavePcbFile( GetScreen()->GetFileName() ); + SavePcbFile( GetBoard()->GetFileName() ); break; } } // Delete the auto save file if it exists. - wxFileName fn = GetScreen()->GetFileName(); + wxFileName fn = GetBoard()->GetFileName(); // Auto save file name is the normal file name prefixed with a '$'. fn.SetName( wxT( "$" ) + fn.GetName() ); @@ -546,6 +546,7 @@ void PCB_EDIT_FRAME::Show3D_Frame( wxCommandEvent& event ) } m_Draw3DFrame = new EDA_3D_FRAME( this, _( "3D Viewer" ) ); + m_Draw3DFrame->SetDefaultFileName( GetBoard()->GetFileName() ); m_Draw3DFrame->Show( true ); } @@ -726,7 +727,7 @@ void PCB_EDIT_FRAME::SetLanguage( wxCommandEvent& event ) wxString PCB_EDIT_FRAME::GetLastNetListRead() { wxFileName absoluteFileName = m_lastNetListRead; - wxFileName pcbFileName = GetScreen()->GetFileName(); + wxFileName pcbFileName = GetBoard()->GetFileName(); if( !absoluteFileName.MakeAbsolute( pcbFileName.GetPath() ) || !absoluteFileName.FileExists() ) { @@ -741,7 +742,7 @@ wxString PCB_EDIT_FRAME::GetLastNetListRead() void PCB_EDIT_FRAME::SetLastNetListRead( const wxString& aLastNetListRead ) { wxFileName relativeFileName = aLastNetListRead; - wxFileName pcbFileName = GetScreen()->GetFileName(); + wxFileName pcbFileName = GetBoard()->GetFileName(); if( relativeFileName.MakeRelativeTo( pcbFileName.GetPath() ) && relativeFileName.GetFullPath() != aLastNetListRead ) @@ -771,7 +772,7 @@ void PCB_EDIT_FRAME::SVG_Print( wxCommandEvent& event ) void PCB_EDIT_FRAME::UpdateTitle() { wxString title; - wxFileName fileName = GetScreen()->GetFileName(); + wxFileName fileName = GetBoard()->GetFileName(); if( fileName.IsOk() && fileName.FileExists() ) { diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index bfa325e1ed..52b9817768 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -182,14 +182,14 @@ Changing extension to .brd." ), GetChars( fn.GetFullPath() ) ); else { // File does not exists: prepare an empty board wxSetWorkingDirectory( fn.GetPath() ); - frame->GetScreen()->SetFileName( fn.GetFullPath( wxPATH_UNIX ) ); + frame->GetBoard()->SetFileName( fn.GetFullPath( wxPATH_UNIX ) ); frame->UpdateTitle(); - frame->UpdateFileHistory( frame->GetScreen()->GetFileName() ); + frame->UpdateFileHistory( frame->GetBoard()->GetFileName() ); frame->OnModify(); // Ready to save the new empty board wxString msg; msg.Printf( _( "File <%s> does not exist.\nThis is normal for a new project" ), - GetChars( frame->GetScreen()->GetFileName() ) ); + GetChars( frame->GetBoard()->GetFileName() ) ); wxMessageBox( msg ); } } diff --git a/pcbnew/pcbnew_config.cpp b/pcbnew/pcbnew_config.cpp index 99c9a4dfa2..3dc0c3420d 100644 --- a/pcbnew/pcbnew_config.cpp +++ b/pcbnew/pcbnew_config.cpp @@ -105,7 +105,7 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) case ID_CONFIG_READ: { - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Read Project File" ), fn.GetPath(), @@ -204,7 +204,7 @@ void PCB_EDIT_FRAME::SaveProjectSettings() { wxFileName fn; - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Save Project File" ), fn.GetPath(), fn.GetFullName(), @@ -391,7 +391,7 @@ void PCB_EDIT_FRAME::SaveMacros() wxXmlProperty *macrosProp, *hkProp, *xProp, *yProp; wxString str, hkStr, xStr, yStr; - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( MacrosFileExtension ); wxFileDialog dlg( this, _( "Save Macros File" ), fn.GetPath(), fn.GetFullName(), @@ -437,7 +437,7 @@ void PCB_EDIT_FRAME::ReadMacros() wxString str; wxFileName fn; - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( MacrosFileExtension ); wxFileDialog dlg( this, _( "Read Macros File" ), fn.GetPath(), diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index 865dc2ac05..00610303e0 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -46,6 +46,9 @@ #include #include #include +#include +#include +#include /* Keywords to r/w options in m_config */ #define CONFIG_XFINESCALE_ADJ wxT( "PlotXFineScaleAdj" ) @@ -56,7 +59,6 @@ #define MIN_SCALE 0.01 #define MAX_SCALE 100.0 - static bool setDouble( double* aDouble, double aValue, double aMin, double aMax ) { if( aValue < aMin ) @@ -74,7 +76,135 @@ static bool setDouble( double* aDouble, double aValue, double aMin, double aMax return true; } +/** Get the 'traditional' gerber extension depending on the layer */ +static wxString GetGerberExtension( int layer )/*{{{*/ +{ + switch( layer ) + { + case LAYER_N_FRONT: + return wxString( wxT( "gtl" ) ); + case LAYER_N_2: + case LAYER_N_3: + case LAYER_N_4: + case LAYER_N_5: + case LAYER_N_6: + case LAYER_N_7: + case LAYER_N_8: + case LAYER_N_9: + case LAYER_N_10: + case LAYER_N_11: + case LAYER_N_12: + case LAYER_N_13: + case LAYER_N_14: + case LAYER_N_15: + + // TODO: see if we use .gbr or a layer identifier (gb1 .. gbnn ?) + // according to the new internal layers designation + // (1 is the first internal layer from the front layer) + return wxString( wxT( "gbr" ) ); + + case LAYER_N_BACK: + return wxString( wxT( "gbl" ) ); + + case ADHESIVE_N_BACK: + return wxString( wxT( "gba" ) ); + + case ADHESIVE_N_FRONT: + return wxString( wxT( "gta" ) ); + + case SOLDERPASTE_N_BACK: + return wxString( wxT( "gbp" ) ); + + case SOLDERPASTE_N_FRONT: + return wxString( wxT( "gtp" ) ); + + case SILKSCREEN_N_BACK: + return wxString( wxT( "gbo" ) ); + + case SILKSCREEN_N_FRONT: + return wxString( wxT( "gto" ) ); + + case SOLDERMASK_N_BACK: + return wxString( wxT( "gbs" ) ); + + case SOLDERMASK_N_FRONT: + return wxString( wxT( "gts" ) ); + + case DRAW_N: + case COMMENT_N: + case ECO1_N: + case ECO2_N: + case EDGE_N: + default: + return wxString( wxT( "gbr" ) ); + } +}/*}}}*/ + +/** Complete a plot filename: forces the output directory, add a suffix to the name + and sets the extension if specified */ +static void BuildPlotFileName( wxFileName *aFilename, /*{{{*/ + const wxString& aOutputDir, + wxString aSuffix, + const wxString& aExtension ) +{ + aFilename->SetPath( aOutputDir ); + + // Set the file extension + aFilename->SetExt( aExtension ); + + /* remove leading and trailing spaces if any from the suffix, if + something survives add it to the name; also the suffix can contain + an extension: if that's the case, apply it */ + aSuffix.Trim( true ); aSuffix.Trim( false ); + + wxFileName suffix_fn( aSuffix ); + + if( suffix_fn.HasName() ) + aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix_fn.GetName() ); + if( suffix_fn.HasExt() ) + aFilename->SetExt( suffix_fn.GetExt() ); +}/*}}}*/ + +/** Fix the output directory pathname to absolute and ensure it exists */ +static bool EnsureOutputDirectory( wxFileName *aOutputDir, /*{{{*/ + const wxString& aBoardFilename, + wxTextCtrl* aMessageBox ) +{ + 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 ); + return false; + } + + wxString outputPath( aOutputDir->GetPath() ); + if( !wxFileName::DirExists( outputPath ) ) + { + if( wxMkdir( outputPath ) ) + { + if( aMessageBox ) + { + wxString msg; + msg.Printf( _( "Directory %s created.\n" ), GetChars( outputPath ) ); + aMessageBox->AppendText( msg ); + return true; + } + } + else + { + wxMessageBox( _( "Cannot create output directory!" ), + _( "Plot" ), wxOK | wxICON_ERROR ); + return false; + } + } + return true; +}/*}}}*/ /** * Class DIALOG_PLOT @@ -111,8 +241,6 @@ private: }; -//const int UNITS_MILS = 1000; - DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aParent ) : DIALOG_PLOT_BASE( aParent ), m_parent( aParent ), @@ -142,26 +270,26 @@ void DIALOG_PLOT::Init_Dialog() m_WidthAdjustMinValue = -(m_board->GetDesignSettings().m_TrackMinWidth - 1); m_WidthAdjustMaxValue = m_board->GetSmallestClearanceValue() - 1; - m_plotFormatOpt->SetSelection( m_plotOpts.GetPlotFormat() ); + m_plotFormatOpt->SetSelection( m_plotOpts.GetFormat() ); // Set units and value for HPGL pen size (this param in in mils). AddUnitSymbol( *m_textPenSize, g_UserUnit ); msg = ReturnStringFromValue( g_UserUnit, - m_plotOpts.GetHpglPenDiameter() * IU_PER_MILS ); + m_plotOpts.GetHPGLPenDiameter() * IU_PER_MILS ); m_HPGLPenSizeOpt->AppendText( msg ); // Units are *always* cm/s for HPGL pen speed, from 1 to 99. - msg = ReturnStringFromValue( UNSCALED_UNITS, m_plotOpts.GetHpglPenSpeed() ); + msg = ReturnStringFromValue( UNSCALED_UNITS, m_plotOpts.GetHPGLPenSpeed() ); m_HPGLPenSpeedOpt->AppendText( msg ); // Set units and value for HPGL pen overlay (this param in in mils). AddUnitSymbol( *m_textPenOvr, g_UserUnit ); msg = ReturnStringFromValue( g_UserUnit, - m_plotOpts.GetHpglPenOverlay() * IU_PER_MILS ); + m_plotOpts.GetHPGLPenOverlay() * IU_PER_MILS ); m_HPGLPenOverlayOpt->AppendText( msg ); AddUnitSymbol( *m_textDefaultPenSize, g_UserUnit ); - msg = ReturnStringFromValue( g_UserUnit, m_plotOpts.GetPlotLineWidth() ); + msg = ReturnStringFromValue( g_UserUnit, m_plotOpts.GetLineWidth() ); m_linesWidth->AppendText( msg ); // Set units for PS global width correction. @@ -187,8 +315,8 @@ void DIALOG_PLOT::Init_Dialog() msg.Printf( wxT( "%f" ), To_User_Unit( g_UserUnit, m_PSWidthAdjust ) ); m_PSFineAdjustWidthOpt->AppendText( msg ); - m_plotPSNegativeOpt->SetValue( m_plotOpts.m_PlotPSNegative ); - m_forcePSA4OutputOpt->SetValue( m_plotOpts.GetPsA4Output() ); + m_plotPSNegativeOpt->SetValue( m_plotOpts.GetNegative() ); + m_forcePSA4OutputOpt->SetValue( m_plotOpts.GetA4Output() ); // List layers in same order than in setup layers dialog // (Front or Top to Back or Bottom) @@ -215,44 +343,36 @@ void DIALOG_PLOT::Init_Dialog() m_useGerberExtensions->SetValue( m_plotOpts.GetUseGerberExtensions() ); // Option for excluding contents of "Edges Pcb" layer - m_excludeEdgeLayerOpt->SetValue( m_plotOpts.m_ExcludeEdgeLayer ); + m_excludeEdgeLayerOpt->SetValue( m_plotOpts.GetExcludeEdgeLayer() ); m_subtractMaskFromSilk->SetValue( m_plotOpts.GetSubtractMaskFromSilk() ); // Option to plot page references: - if( m_parent->GetPrintBorderAndTitleBlock() ) - { - m_plotSheetRef->SetValue( m_plotOpts.m_PlotFrameRef ); - } - else - { - m_plotSheetRef->Enable( false ); - m_plotSheetRef->SetValue( false ); - } + m_plotSheetRef->SetValue( m_plotOpts.GetPlotFrameRef() ); - // Option to plot pads on silkscreen layers or all layers - m_plotPads_on_Silkscreen->SetValue( m_plotOpts.m_PlotPadsOnSilkLayer ); + // Option to allow pads on silkscreen layers + m_plotPads_on_Silkscreen->SetValue( m_plotOpts.GetPlotPadsOnSilkLayer() ); // Options to plot texts on footprints - m_plotModuleValueOpt->SetValue( m_plotOpts.m_PlotValue ); - m_plotModuleRefOpt->SetValue( m_plotOpts.m_PlotReference ); - m_plotTextOther->SetValue( m_plotOpts.m_PlotTextOther ); - m_plotInvisibleText->SetValue( m_plotOpts.m_PlotInvisibleTexts ); + m_plotModuleValueOpt->SetValue( m_plotOpts.GetPlotValue() ); + m_plotModuleRefOpt->SetValue( m_plotOpts.GetPlotReference() ); + m_plotTextOther->SetValue( m_plotOpts.GetPlotOtherText() ); + m_plotInvisibleText->SetValue( m_plotOpts.GetPlotInvisibleText() ); // Options to plot pads and vias holes - m_drillShapeOpt->SetSelection( m_plotOpts.m_DrillShapeOpt ); + m_drillShapeOpt->SetSelection( m_plotOpts.GetDrillMarksType() ); // Scale option m_scaleOpt->SetSelection( m_plotOpts.GetScaleSelection() ); // Plot mode - m_plotModeOpt->SetSelection( m_plotOpts.m_PlotMode ); + m_plotModeOpt->SetSelection( m_plotOpts.GetMode() ); // Plot mirror option - m_plotMirrorOpt->SetValue( m_plotOpts.m_PlotMirror ); + m_plotMirrorOpt->SetValue( m_plotOpts.GetMirror() ); // Put vias on mask layer - m_plotNoViaOnMaskOpt->SetValue( m_plotOpts.m_PlotViaOnMaskLayer ); + m_plotNoViaOnMaskOpt->SetValue( m_plotOpts.GetPlotViaOnMaskLayer() ); // Output directory m_outputDirectoryName->SetValue( m_plotOpts.GetOutputDirectory() ); @@ -319,7 +439,7 @@ void DIALOG_PLOT::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT ); if( dialog.ShowModal() == wxID_YES ) { - wxString boardFilePath = ( (wxFileName) m_parent->GetScreen()->GetFileName()).GetPath(); + wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName()).GetPath(); if( !dirName.MakeRelativeTo( boardFilePath ) ) wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ), @@ -335,37 +455,39 @@ void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event ) switch( m_plotFormatOpt->GetSelection() ) { case PLOT_FORMAT_POST: - default: m_drillShapeOpt->Enable( true ); m_plotModeOpt->Enable( true ); m_plotMirrorOpt->Enable( true ); m_useAuxOriginCheckBox->Enable( false ); + m_useAuxOriginCheckBox->SetValue( false ); m_linesWidth->Enable( true ); m_HPGLPenSizeOpt->Enable( false ); m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); - m_excludeEdgeLayerOpt->SetValue( false ); - m_excludeEdgeLayerOpt->Enable( false ); + m_excludeEdgeLayerOpt->Enable( true ); m_subtractMaskFromSilk->Enable( false ); + m_subtractMaskFromSilk->SetValue( false ); m_useGerberExtensions->Enable( false ); + m_useGerberExtensions->SetValue( false ); m_scaleOpt->Enable( true ); m_fineAdjustXscaleOpt->Enable( true ); m_fineAdjustYscaleOpt->Enable( true ); m_PSFineAdjustWidthOpt->Enable( true ); m_plotPSNegativeOpt->Enable( true ); + m_forcePSA4OutputOpt->Enable( true ); + m_PlotOptionsSizer->Hide( m_GerberOptionsSizer ); m_PlotOptionsSizer->Hide( m_HPGLOptionsSizer ); m_PlotOptionsSizer->Show( m_PSOptionsSizer ); - Layout(); - m_MainSizer->SetSizeHints( this ); break; case PLOT_FORMAT_GERBER: m_drillShapeOpt->Enable( false ); - m_plotModeOpt->SetSelection( 1 ); + m_drillShapeOpt->SetSelection( 0 ); m_plotModeOpt->Enable( false ); - m_plotMirrorOpt->SetValue( false ); + m_plotModeOpt->SetSelection( 1 ); m_plotMirrorOpt->Enable( false ); + m_plotMirrorOpt->SetValue( false ); m_useAuxOriginCheckBox->Enable( true ); m_linesWidth->Enable( true ); m_HPGLPenSizeOpt->Enable( false ); @@ -374,74 +496,89 @@ void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event ) m_excludeEdgeLayerOpt->Enable( true ); m_subtractMaskFromSilk->Enable( true ); m_useGerberExtensions->Enable( true ); - m_scaleOpt->SetSelection( 1 ); m_scaleOpt->Enable( false ); + m_scaleOpt->SetSelection( 1 ); m_fineAdjustXscaleOpt->Enable( false ); m_fineAdjustYscaleOpt->Enable( false ); m_PSFineAdjustWidthOpt->Enable( false ); - m_plotPSNegativeOpt->SetValue( false ); m_plotPSNegativeOpt->Enable( false ); + m_plotPSNegativeOpt->SetValue( false ); + m_forcePSA4OutputOpt->Enable( false ); + m_forcePSA4OutputOpt->SetValue( false ); + m_PlotOptionsSizer->Show( m_GerberOptionsSizer ); m_PlotOptionsSizer->Hide( m_HPGLOptionsSizer ); m_PlotOptionsSizer->Hide( m_PSOptionsSizer ); - Layout(); - m_MainSizer->SetSizeHints( this ); break; case PLOT_FORMAT_HPGL: - m_plotMirrorOpt->Enable( true ); - m_drillShapeOpt->Enable( false ); + m_drillShapeOpt->Enable( true ); m_plotModeOpt->Enable( true ); + m_plotMirrorOpt->Enable( true ); m_useAuxOriginCheckBox->Enable( false ); + m_useAuxOriginCheckBox->SetValue( false ); m_linesWidth->Enable( false ); m_HPGLPenSizeOpt->Enable( true ); m_HPGLPenSpeedOpt->Enable( true ); m_HPGLPenOverlayOpt->Enable( true ); - m_excludeEdgeLayerOpt->SetValue( false ); - m_excludeEdgeLayerOpt->Enable( false ); + m_excludeEdgeLayerOpt->Enable( true ); m_subtractMaskFromSilk->Enable( false ); + m_subtractMaskFromSilk->SetValue( false ); m_useGerberExtensions->Enable( false ); + m_useGerberExtensions->SetValue( false ); m_scaleOpt->Enable( true ); m_fineAdjustXscaleOpt->Enable( false ); m_fineAdjustYscaleOpt->Enable( false ); m_PSFineAdjustWidthOpt->Enable( false ); m_plotPSNegativeOpt->SetValue( false ); m_plotPSNegativeOpt->Enable( false ); + m_forcePSA4OutputOpt->Enable( true ); + m_PlotOptionsSizer->Hide( m_GerberOptionsSizer ); m_PlotOptionsSizer->Show( m_HPGLOptionsSizer ); m_PlotOptionsSizer->Hide( m_PSOptionsSizer ); - Layout(); - m_MainSizer->SetSizeHints( this ); break; case PLOT_FORMAT_DXF: + m_drillShapeOpt->Enable( true ); + m_plotModeOpt->Enable( true ); m_plotMirrorOpt->Enable( false ); m_plotMirrorOpt->SetValue( false ); - m_drillShapeOpt->Enable( false ); - m_plotModeOpt->Enable( true ); - m_useAuxOriginCheckBox->Enable( false ); + m_useAuxOriginCheckBox->Enable( true ); m_linesWidth->Enable( false ); m_HPGLPenSizeOpt->Enable( false ); m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); - m_excludeEdgeLayerOpt->SetValue( false ); - m_excludeEdgeLayerOpt->Enable( false ); + m_excludeEdgeLayerOpt->Enable( true ); m_subtractMaskFromSilk->Enable( false ); + m_subtractMaskFromSilk->SetValue( false ); m_useGerberExtensions->Enable( false ); + m_useGerberExtensions->SetValue( false ); m_scaleOpt->Enable( false ); m_scaleOpt->SetSelection( 1 ); m_fineAdjustXscaleOpt->Enable( false ); m_fineAdjustYscaleOpt->Enable( false ); m_PSFineAdjustWidthOpt->Enable( false ); - m_plotPSNegativeOpt->SetValue( false ); m_plotPSNegativeOpt->Enable( false ); - m_PlotOptionsSizer->Hide( m_GerberOptionsSizer ); + m_plotPSNegativeOpt->SetValue( false ); + m_forcePSA4OutputOpt->Enable( false ); + m_forcePSA4OutputOpt->SetValue( false ); + + m_PlotOptionsSizer->Show( m_GerberOptionsSizer ); m_PlotOptionsSizer->Hide( m_HPGLOptionsSizer ); m_PlotOptionsSizer->Hide( m_PSOptionsSizer ); - Layout(); - m_MainSizer->SetSizeHints( this ); break; + + default: + wxASSERT( false ); } + + /* Update the interlock between scale and frame reference + * (scaling would mess up the frame border...) */ + OnSetScaleOpt( event ); + + Layout(); + m_MainSizer->SetSizeHints( this ); } @@ -449,29 +586,28 @@ void DIALOG_PLOT::applyPlotSettings() { PCB_PLOT_PARAMS tempOptions; - tempOptions.m_ExcludeEdgeLayer = m_excludeEdgeLayerOpt->GetValue(); + tempOptions.SetExcludeEdgeLayer( m_excludeEdgeLayerOpt->GetValue() ); tempOptions.SetSubtractMaskFromSilk( m_subtractMaskFromSilk->GetValue() ); - if( m_plotSheetRef ) - tempOptions.m_PlotFrameRef = m_plotSheetRef->GetValue(); + tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() ); - tempOptions.m_PlotPadsOnSilkLayer = m_plotPads_on_Silkscreen->GetValue(); + tempOptions.SetPlotPadsOnSilkLayer( m_plotPads_on_Silkscreen->GetValue() ); tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() ); - tempOptions.m_PlotValue = m_plotModuleValueOpt->GetValue(); - tempOptions.m_PlotReference = m_plotModuleRefOpt->GetValue(); - tempOptions.m_PlotTextOther = m_plotTextOther->GetValue(); - tempOptions.m_PlotInvisibleTexts = m_plotInvisibleText->GetValue(); + tempOptions.SetPlotValue( m_plotModuleValueOpt->GetValue() ); + tempOptions.SetPlotReference( m_plotModuleRefOpt->GetValue() ); + tempOptions.SetPlotOtherText( m_plotTextOther->GetValue() ); + tempOptions.SetPlotInvisibleText( m_plotInvisibleText->GetValue() ); tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() ); - tempOptions.m_DrillShapeOpt = - (PCB_PLOT_PARAMS::DrillShapeOptT) m_drillShapeOpt->GetSelection(); - tempOptions.m_PlotMirror = m_plotMirrorOpt->GetValue(); - tempOptions.m_PlotMode = (EDA_DRAW_MODE_T) m_plotModeOpt->GetSelection(); - tempOptions.m_PlotViaOnMaskLayer = m_plotNoViaOnMaskOpt->GetValue(); + tempOptions.SetDrillMarksType( static_cast + ( m_drillShapeOpt->GetSelection() ) ); + tempOptions.SetMirror( m_plotMirrorOpt->GetValue() ); + tempOptions.SetMode( static_cast( m_plotModeOpt->GetSelection() ) ); + tempOptions.SetPlotViaOnMaskLayer( m_plotNoViaOnMaskOpt->GetValue() ); // Update settings from text fields. Rewrite values back to the fields, // since the values may have been constrained by the setters. @@ -480,9 +616,9 @@ void DIALOG_PLOT::applyPlotSettings() wxString msg = m_HPGLPenSizeOpt->GetValue(); int tmp = ReturnValueFromString( g_UserUnit, msg ) / IU_PER_MILS; - if( !tempOptions.SetHpglPenDiameter( tmp ) ) + if( !tempOptions.SetHPGLPenDiameter( tmp ) ) { - msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetHpglPenDiameter() * IU_PER_MILS ); + msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetHPGLPenDiameter() * IU_PER_MILS ); m_HPGLPenSizeOpt->SetValue( msg ); msg.Printf( _( "HPGL pen size constrained!\n" ) ); m_messagesBox->AppendText( msg ); @@ -492,9 +628,9 @@ void DIALOG_PLOT::applyPlotSettings() msg = m_HPGLPenSpeedOpt->GetValue(); tmp = ReturnValueFromString( UNSCALED_UNITS, msg ); - if( !tempOptions.SetHpglPenSpeed( tmp ) ) + if( !tempOptions.SetHPGLPenSpeed( tmp ) ) { - msg = ReturnStringFromValue( UNSCALED_UNITS, tempOptions.GetHpglPenSpeed() ); + msg = ReturnStringFromValue( UNSCALED_UNITS, tempOptions.GetHPGLPenSpeed() ); m_HPGLPenSpeedOpt->SetValue( msg ); msg.Printf( _( "HPGL pen speed constrained!\n" ) ); m_messagesBox->AppendText( msg ); @@ -504,10 +640,10 @@ void DIALOG_PLOT::applyPlotSettings() msg = m_HPGLPenOverlayOpt->GetValue(); tmp = ReturnValueFromString( g_UserUnit, msg ) / IU_PER_MILS; - if( !tempOptions.SetHpglPenOverlay( tmp ) ) + if( !tempOptions.SetHPGLPenOverlay( tmp ) ) { msg = ReturnStringFromValue( g_UserUnit, - tempOptions.GetHpglPenOverlay() * IU_PER_MILS ); + tempOptions.GetHPGLPenOverlay() * IU_PER_MILS ); m_HPGLPenOverlayOpt->SetValue( msg ); msg.Printf( _( "HPGL pen overlay constrained!\n" ) ); m_messagesBox->AppendText( msg ); @@ -517,9 +653,9 @@ void DIALOG_PLOT::applyPlotSettings() msg = m_linesWidth->GetValue(); tmp = ReturnValueFromString( g_UserUnit, msg ); - if( !tempOptions.SetPlotLineWidth( tmp ) ) + if( !tempOptions.SetLineWidth( tmp ) ) { - msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetPlotLineWidth() ); + msg = ReturnStringFromValue( g_UserUnit, tempOptions.GetLineWidth() ); m_linesWidth->SetValue( msg ); msg.Printf( _( "Default linewidth constrained!\n" ) ); m_messagesBox->AppendText( msg ); @@ -575,7 +711,7 @@ void DIALOG_PLOT::applyPlotSettings() tempOptions.SetUseGerberExtensions( m_useGerberExtensions->GetValue() ); - tempOptions.SetPlotFormat( m_plotFormatOpt->GetSelection() ); + tempOptions.SetFormat( static_cast( m_plotFormatOpt->GetSelection() ) ); long selectedLayers = 0; unsigned int i; @@ -587,8 +723,8 @@ void DIALOG_PLOT::applyPlotSettings() } tempOptions.SetLayerSelection( selectedLayers ); - tempOptions.m_PlotPSNegative = m_plotPSNegativeOpt->GetValue(); - tempOptions.SetPsA4Output( m_forcePSA4OutputOpt->GetValue() ); + tempOptions.SetNegative( m_plotPSNegativeOpt->GetValue() ); + tempOptions.SetA4Output( m_forcePSA4OutputOpt->GetValue() ); // Set output directory and replace backslashes with forward ones wxString dirStr; @@ -608,63 +744,37 @@ void DIALOG_PLOT::applyPlotSettings() void DIALOG_PLOT::Plot( wxCommandEvent& event ) { int layer; - wxFileName fn; - wxString ext; applyPlotSettings(); - // Create output directory if it does not exist + // 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 boardFilePath = ( (wxFileName) m_parent->GetScreen()->GetFileName()).GetPath(); - - if( !outputDir.MakeAbsolute( boardFilePath ) ) - { - wxString msg; - msg.Printf( _( " Cannot make %s absolute with respect to %s!" ), - GetChars( outputDir.GetPath() ), - GetChars( boardFilePath ) ); - wxMessageBox( msg, _( "Plot" ), wxOK | wxICON_ERROR ); + wxString boardFilename = m_parent->GetBoard()->GetFileName(); + if( !EnsureOutputDirectory( &outputDir, boardFilename, m_messagesBox ) ) return; - } - - if( !wxFileName::DirExists( outputDir.GetPath() ) ) - { - if( wxMkdir( outputDir.GetPath() ) ) - { - wxString msg; - msg.Printf( _( "Directory %s created.\n" ), GetChars( outputDir.GetPath() ) ); - m_messagesBox->AppendText( msg ); - } - else - { - wxMessageBox( _( "Cannot create output directory!" ), - _( "Plot" ), wxOK | wxICON_ERROR ); - return; - } - } - - m_plotOpts.m_AutoScale = false; - m_plotOpts.m_PlotScale = 1; + m_plotOpts.SetAutoScale( false ); + m_plotOpts.SetScale( 1 ); switch( m_plotOpts.GetScaleSelection() ) { default: break; - case 0: - m_plotOpts.m_AutoScale = true; + case 0: // Autoscale option + m_plotOpts.SetAutoScale( true ); break; - case 2: - m_plotOpts.m_PlotScale = 1.5; + case 2: // 3:2 option + m_plotOpts.SetScale( 1.5 ); break; - case 3: - m_plotOpts.m_PlotScale = 2; + case 3: // 2:1 option + m_plotOpts.SetScale( 2 ); break; - case 4: - m_plotOpts.m_PlotScale = 3; + case 4: // 3:1 option + m_plotOpts.SetScale( 3 ); break; } @@ -674,176 +784,66 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event ) * settings resulting in a divide by zero fault. */ if( m_fineAdjustXscaleOpt->IsEnabled() && m_XScaleAdjust != 0.0 ) - m_plotOpts.m_FineScaleAdjustX = m_XScaleAdjust; + m_plotOpts.SetFineScaleAdjustX( m_XScaleAdjust ); if( m_fineAdjustYscaleOpt->IsEnabled() && m_YScaleAdjust != 0.0 ) - m_plotOpts.m_FineScaleAdjustY = m_YScaleAdjust; + m_plotOpts.SetFineScaleAdjustY( m_YScaleAdjust ); if( m_PSFineAdjustWidthOpt->IsEnabled() ) - m_plotOpts.m_FineWidthAdjust = m_PSWidthAdjust; + m_plotOpts.SetWidthAdjust( m_PSWidthAdjust ); - switch( m_plotOpts.GetPlotFormat() ) - { - case PLOT_FORMAT_POST: - ext = wxT( "ps" ); - break; - - case PLOT_FORMAT_GERBER: - m_plotOpts.m_PlotScale = 1.0; // No scale option allowed in gerber format - ext = wxT( "pho" ); - break; - - case PLOT_FORMAT_HPGL: - ext = wxT( "plt" ); - break; - - case PLOT_FORMAT_DXF: - m_plotOpts.m_PlotScale = 1.0; - ext = wxT( "dxf" ); - break; - } + wxString file_ext( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) ); // Test for a reasonable scale value - if( m_plotOpts.m_PlotScale < MIN_SCALE ) + // XXX could this actually happen? isn't it constrained in the apply + // function? + if( m_plotOpts.GetScale() < MIN_SCALE ) DisplayInfoMessage( this, _( "Warning: Scale option set to a very small value" ) ); - if( m_plotOpts.m_PlotScale > MAX_SCALE ) + if( m_plotOpts.GetScale() > 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 ); long layerMask = 1; for( layer = 0; layer < NB_LAYERS; layer++, layerMask <<= 1 ) { - bool success = false; - if( m_plotOpts.GetLayerSelection() & layerMask ) { - fn = m_parent->GetScreen()->GetFileName(); - fn.SetPath( outputDir.GetPath() ); - - // Create file name (from the English layer name for non copper layers). - wxString layername = m_board->GetLayerName( layer, false ); - // remove leading and trailing spaces if any - layername.Trim( true ); layername.Trim( false ); - fn.SetName( fn.GetName() + wxT( "-" ) + layername ); + // 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.GetPlotFormat() == PLOT_FORMAT_GERBER ) + if( ( m_plotOpts.GetFormat() == PLOT_FORMAT_GERBER ) && m_useGerberExtensions->GetValue() ) - { - switch( layer ) - { - case LAYER_N_FRONT: - fn.SetExt( wxT( "gtl" ) ); - break; + file_ext = GetGerberExtension( layer ); - case LAYER_N_2: - case LAYER_N_3: - case LAYER_N_4: - case LAYER_N_5: - case LAYER_N_6: - case LAYER_N_7: - case LAYER_N_8: - case LAYER_N_9: - case LAYER_N_10: - case LAYER_N_11: - case LAYER_N_12: - case LAYER_N_13: - case LAYER_N_14: - case LAYER_N_15: + // Create file name (from the English layer name for non copper layers). + BuildPlotFileName( &fn, outputDir.GetPath(), + m_board->GetLayerName( layer, false ), + file_ext ); - // TODO: see if we use .gbr or a layer identifier (gb1 .. gbnn ?) - // according to the new internal layers designation - // (1 is the first internal layer from the front layer) - fn.SetExt( wxT( "gbr" ) ); - break; - - case LAYER_N_BACK: - fn.SetExt( wxT( "gbl" ) ); - break; - - case ADHESIVE_N_BACK: - fn.SetExt( wxT( "gba" ) ); - break; - - case ADHESIVE_N_FRONT: - fn.SetExt( wxT( "gta" ) ); - break; - - case SOLDERPASTE_N_BACK: - fn.SetExt( wxT( "gbp" ) ); - break; - - case SOLDERPASTE_N_FRONT: - fn.SetExt( wxT( "gtp" ) ); - break; - - case SILKSCREEN_N_BACK: - fn.SetExt( wxT( "gbo" ) ); - break; - - case SILKSCREEN_N_FRONT: - fn.SetExt( wxT( "gto" ) ); - break; - - case SOLDERMASK_N_BACK: - fn.SetExt( wxT( "gbs" ) ); - break; - - case SOLDERMASK_N_FRONT: - fn.SetExt( wxT( "gts" ) ); - break; - - case DRAW_N: - case COMMENT_N: - case ECO1_N: - case ECO2_N: - case EDGE_N: - default: - fn.SetExt( wxT( "gbr" ) ); - break; - } - } - else - { - fn.SetExt( ext ); - } - - switch( m_plotOpts.GetPlotFormat() ) - { - case PLOT_FORMAT_POST: - success = m_parent->ExportToPostScriptFile( fn.GetFullPath(), layer, - m_plotOpts.GetPsA4Output(), - m_plotOpts.m_PlotMode ); - break; - - case PLOT_FORMAT_GERBER: - success = m_parent->ExportToGerberFile( fn.GetFullPath(), layer, - m_plotOpts.GetUseAuxOrigin(), - m_plotOpts.m_PlotMode ); - break; - - case PLOT_FORMAT_HPGL: - success = m_parent->ExportToHpglFile( fn.GetFullPath(), layer, - m_plotOpts.m_PlotMode ); - break; - - case PLOT_FORMAT_DXF: - success = m_parent->ExportToDxfFile( fn.GetFullPath(), layer, - m_plotOpts.m_PlotMode ); - break; - } + 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 ) + { + PlotBoardLayer( board, plotter, layer, m_plotOpts ); + plotter->EndPlot(); + delete plotter; - if( success ) msg.Printf( _( "Plot file <%s> created" ), GetChars( fn.GetFullPath() ) ); + } else msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); @@ -864,3 +864,81 @@ 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; + + if( m_plotter ) + { + m_plotter->EndPlot(); + delete m_plotter; + m_plotter = NULL; + } +} + +/** Open a new plotfile; works as a factory for plotter objects + */ +bool PLOT_CONTROLLER::OpenPlotfile( const wxString &aSuffix, /*{{{*/ + PlotFormat aFormat, + const wxString &aSheetDesc ) +{ + LOCALE_IO toggle; + + /* Save the current format: sadly some plot routines depends on this + but the main reason is that the StartPlot method uses it to + dispatch the plotter creation */ + m_plotOpts.SetFormat( aFormat ); + + // Ensure that the previous plot is closed + ClosePlot(); + + // Now compute the full filename for the output and start the plot + // (after ensuring the output directory is OK) + wxString outputDirName = m_plotOpts.GetOutputDirectory() ; + wxFileName outputDir = wxFileName::DirName( outputDirName ); + wxString boardFilename = m_board->GetFileName(); + if( EnsureOutputDirectory( &outputDir, boardFilename, NULL ) ) + { + wxFileName fn( boardFilename ); + BuildPlotFileName( &fn, outputDirName, + aSuffix, GetDefaultPlotExtension( aFormat ) ); + + 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( int aLayer )/*{{{*/ +{ + LOCALE_IO toggle; + + // No plot open, nothing to do... + if( !m_plotter ) + return false; + + // Fully delegated to the parent + PlotBoardLayer( m_board, m_plotter, aLayer, m_plotOpts ); + + return true; +}/*}}}*/ + diff --git a/pcbnew/pcbplot.h b/pcbnew/pcbplot.h index 255137c1a5..cea86fdf25 100644 --- a/pcbnew/pcbplot.h +++ b/pcbnew/pcbplot.h @@ -56,6 +56,46 @@ void Plot_1_EdgeModule( PLOTTER* plotter, const PCB_PLOT_PARAMS& aPlotOpts, EDGE void PlotFilledAreas( PLOTTER* plotter, const PCB_PLOT_PARAMS& aPlotOpts, ZONE_CONTAINER* aZone, EDA_DRAW_MODE_T trace_mode ); +PLOTTER *StartPlotBoard( BOARD *aBoard, + PCB_PLOT_PARAMS *aPlotOpts, + const wxString& aFullFileName, + const wxString& aSheetDesc ); + +void PlotBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, int Layer, + const PCB_PLOT_PARAMS& plot_opts ); + +/** + * Function Plot_Standard_Layer + * plot copper or technical layers. + * not used for silk screen layers, because these layers have specific + * requirements, mainly for pads + * @param aPlotter = the plotter to use + * @param aLayerMask = the mask to define the layers to plot + * @param aPlotVia = true to plot vias, false to skip vias (has meaning + * only for solder mask layers). + * @param aPlotMode = the plot mode (files, sketch). Has meaning for some formats only + * @param aSkipNPTH_Pads = true to skip NPTH Pads, when the pad size and the pad hole + * have the same size. Used in GERBER format only. + */ +void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, + const PCB_PLOT_PARAMS& plot_opts, + bool aPlotVia, bool aSkipNPTH_Pads ); + +void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, + const PCB_PLOT_PARAMS& plot_opts ); + +/** + * Function PlotDrillMarks + * Draw a drill mark for pads and vias. + * Must be called after all drawings, because it + * redraw the drill mark on a pad or via, as a negative (i.e. white) shape + * in FILLED plot mode + * @param aPlotter = the PLOTTER + * @param aPlotOpts = plot options + */ +void PlotDrillMarks( BOARD *aBoard, PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts ); + + // PLOTGERB.CPP void SelectD_CODE_For_LineDraw( PLOTTER* plotter, int aSize ); diff --git a/pcbnew/plot_rtn.cpp b/pcbnew/plot_rtn.cpp index 0617152f06..50fb516106 100644 --- a/pcbnew/plot_rtn.cpp +++ b/pcbnew/plot_rtn.cpp @@ -30,21 +30,22 @@ static void Plot_Edges_Modules( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, BOARD* pcb, int aLayerMask, EDA_DRAW_MODE_T trace_mode ); -static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, EDA_DRAW_MODE_T trace_mode ); +static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, + EDA_DRAW_MODE_T trace_mode, EDA_COLOR_T aColor ); /* Creates the plot for silkscreen layers */ -void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* aPlotter, int aLayerMask, EDA_DRAW_MODE_T trace_mode ) +void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, + const PCB_PLOT_PARAMS& plot_opts ) { - bool trace_val, trace_ref; TEXTE_MODULE* pt_texte; - const PCB_PLOT_PARAMS& plot_opts = GetPlotSettings(); + EDA_DRAW_MODE_T trace_mode = plot_opts.GetMode(); // Plot edge layer and graphic items - for( EDA_ITEM* item = m_Pcb->m_Drawings; item; item = item->Next() ) + for( EDA_ITEM* item = aBoard->m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { @@ -68,24 +69,24 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* aPlotter, int aLayerMask, EDA_DRAW break; default: - DisplayError( this, wxT( "PlotSilkScreen() error: unexpected Type()" ) ); + DisplayError( NULL, wxT( "PlotSilkScreen() error: unexpected Type()" ) ); break; } } // Plot footprint outlines : - Plot_Edges_Modules( aPlotter, plot_opts, m_Pcb, aLayerMask, trace_mode ); + Plot_Edges_Modules( aPlotter, plot_opts, aBoard, aLayerMask, trace_mode ); // Plot pads (creates pads outlines, for pads on silkscreen layers) int layersmask_plotpads = aLayerMask; // Calculate the mask layers of allowed layers for pads - if( !plot_opts.m_PlotPadsOnSilkLayer ) // Do not plot pads on silk screen layers + if( !plot_opts.GetPlotPadsOnSilkLayer() ) // Do not plot pads on silk screen layers layersmask_plotpads &= ~(SILKSCREEN_LAYER_BACK | SILKSCREEN_LAYER_FRONT ); if( layersmask_plotpads ) { - for( MODULE* Module = m_Pcb->m_Modules; Module; Module = Module->Next() ) + for( MODULE* Module = aBoard->m_Modules; Module; Module = Module->Next() ) { for( D_PAD * pad = Module->m_Pads; pad != NULL; pad = pad->Next() ) { @@ -126,11 +127,11 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* aPlotter, int aLayerMask, EDA_DRAW } // Plot footprints fields (ref, value ...) - for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() ) + for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) { // see if we want to plot VALUE and REF fields - trace_val = plot_opts.m_PlotValue; - trace_ref = plot_opts.m_PlotReference; + bool trace_val = plot_opts.GetPlotValue(); + bool trace_ref = plot_opts.GetPlotReference(); TEXTE_MODULE* text = module->m_Reference; unsigned textLayer = text->GetLayer(); @@ -142,14 +143,14 @@ void PCB_BASE_FRAME::PlotSilkScreen( PLOTTER* aPlotter, int aLayerMask, EDA_DRAW errMsg.Printf( _( "Your BOARD has a bad layer number of %u for \ module\n %s's \"reference\" text." ), textLayer, GetChars( module->GetReference() ) ); - DisplayError( this, errMsg ); + DisplayError( NULL, errMsg ); return; } if( ( ( 1 << textLayer ) & aLayerMask ) == 0 ) trace_ref = false; - if( !text->IsVisible() && !plot_opts.m_PlotInvisibleTexts ) + if( !text->IsVisible() && !plot_opts.GetPlotInvisibleText() ) trace_ref = false; text = module->m_Value; @@ -162,22 +163,24 @@ module\n %s's \"reference\" text." ), errMsg.Printf( _( "Your BOARD has a bad layer number of %u for \ module\n %s's \"value\" text." ), textLayer, GetChars( module->GetReference() ) ); - DisplayError( this, errMsg ); + DisplayError( NULL, errMsg ); return; } if( ( (1 << textLayer) & aLayerMask ) == 0 ) trace_val = false; - if( !text->IsVisible() && !plot_opts.m_PlotInvisibleTexts ) + if( !text->IsVisible() && !plot_opts.GetPlotInvisibleText() ) trace_val = false; // Plot text fields, if allowed if( trace_ref ) - PlotTextModule( aPlotter, module->m_Reference, trace_mode ); + PlotTextModule( aPlotter, module->m_Reference, + trace_mode, plot_opts.GetReferenceColor() ); if( trace_val ) - PlotTextModule( aPlotter, module->m_Value, trace_mode ); + PlotTextModule( aPlotter, module->m_Value, + trace_mode, plot_opts.GetValueColor() ); for( pt_texte = (TEXTE_MODULE*) module->m_Drawings.GetFirst(); pt_texte != NULL; @@ -186,10 +189,10 @@ module\n %s's \"value\" text." ), if( pt_texte->Type() != PCB_MODULE_TEXT_T ) continue; - if( !plot_opts.m_PlotTextOther ) + if( !plot_opts.GetPlotOtherText() ) continue; - if( !pt_texte->IsVisible() && !plot_opts.m_PlotInvisibleTexts ) + if( !pt_texte->IsVisible() && !plot_opts.GetPlotInvisibleText() ) continue; textLayer = pt_texte->GetLayer(); @@ -202,21 +205,22 @@ module\n %s's \"value\" text." ), for module\n %s's \"module text\" text of %s." ), textLayer, GetChars( module->GetReference() ), GetChars( pt_texte->m_Text ) ); - DisplayError( this, errMsg ); + DisplayError( NULL, errMsg ); return; } if( !( ( 1 << textLayer ) & aLayerMask ) ) continue; - PlotTextModule( aPlotter, pt_texte, trace_mode ); + PlotTextModule( aPlotter, pt_texte, + trace_mode, plot_opts.GetColor() ); } } // Plot filled areas - for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ ) + for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ ) { - ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii ); + ZONE_CONTAINER* edge_zone = aBoard->GetArea( ii ); if( ( ( 1 << edge_zone->GetLayer() ) & aLayerMask ) == 0 ) continue; @@ -226,7 +230,7 @@ for module\n %s's \"module text\" text of %s." ), // Plot segments used to fill zone areas (outdated, but here for old boards // compatibility): - for( SEGZONE* seg = m_Pcb->m_Zone; seg != NULL; seg = seg->Next() ) + for( SEGZONE* seg = aBoard->m_Zone; seg != NULL; seg = seg->Next() ) { if( ( ( 1 << seg->GetLayer() ) & aLayerMask ) == 0 ) continue; @@ -236,7 +240,8 @@ for module\n %s's \"module text\" text of %s." ), } -static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, EDA_DRAW_MODE_T trace_mode ) +static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, + EDA_DRAW_MODE_T trace_mode, EDA_COLOR_T aColor ) { wxSize size; wxPoint pos; @@ -262,7 +267,7 @@ static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, EDA_DRAW_ // So we set bold flag to true bool allow_bold = pt_texte->m_Bold || thickness; - aPlotter->Text( pos, BLACK, + aPlotter->Text( pos, aColor, pt_texte->m_Text, orient, size, pt_texte->m_HJustify, pt_texte->m_VJustify, @@ -270,7 +275,8 @@ static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, EDA_DRAW_ } -void PlotDimension( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, DIMENSION* aDim, int aLayerMask, +void PlotDimension( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, + DIMENSION* aDim, int aLayerMask, EDA_DRAW_MODE_T trace_mode ) { if( (GetLayerMask( aDim->GetLayer() ) & aLayerMask) == 0 ) @@ -313,7 +319,8 @@ void PlotDimension( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, DIMENSI } -void PlotPcbTarget( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, PCB_TARGET* aMire, int aLayerMask, +void PlotPcbTarget( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, + PCB_TARGET* aMire, int aLayerMask, EDA_DRAW_MODE_T trace_mode ) { int dx1, dx2, dy1, dy2, radius; @@ -359,7 +366,9 @@ void PlotPcbTarget( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, PCB_TAR // Plot footprints graphic items (outlines) -void Plot_Edges_Modules( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, BOARD* aPcb, int aLayerMask, EDA_DRAW_MODE_T trace_mode ) +static void Plot_Edges_Modules( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, + BOARD* aPcb, int aLayerMask, + EDA_DRAW_MODE_T trace_mode ) { for( MODULE* module = aPcb->m_Modules; module; module = module->Next() ) { @@ -381,7 +390,8 @@ void Plot_Edges_Modules( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, BO //* Plot a graphic item (outline) relative to a footprint void Plot_1_EdgeModule( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, - EDGE_MODULE* aEdge, EDA_DRAW_MODE_T trace_mode, int masque_layer ) + EDGE_MODULE* aEdge, EDA_DRAW_MODE_T trace_mode, + int masque_layer ) { int type_trace; // Type of item to plot. int thickness; // Segment thickness. @@ -417,7 +427,7 @@ void Plot_1_EdgeModule( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, double endAngle = startAngle + aEdge->GetAngle(); - if ( ( aPlotOpts.GetPlotFormat() == PLOT_FORMAT_DXF ) && + if ( ( aPlotOpts.GetFormat() == PLOT_FORMAT_DXF ) && ( masque_layer & ( SILKSCREEN_LAYER_BACK | DRAW_LAYER | COMMENT_LAYER ) ) ) aPlotter->ThickArc( pos, -startAngle, -endAngle, radius, thickness, trace_mode ); @@ -502,7 +512,7 @@ void PlotTextePcb( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, TEXTE_PC for( unsigned i = 0; i < list->Count(); i++ ) { wxString txt = list->Item( i ); - aPlotter->Text( pos, BLACK, txt, orient, size, + aPlotter->Text( pos, UNSPECIFIED, txt, orient, size, pt_texte->m_HJustify, pt_texte->m_VJustify, thickness, pt_texte->m_Italic, allow_bold ); pos += offset; @@ -512,7 +522,7 @@ void PlotTextePcb( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, TEXTE_PC } else { - aPlotter->Text( pos, BLACK, pt_texte->m_Text, orient, size, + aPlotter->Text( pos, UNSPECIFIED, pt_texte->m_Text, orient, size, pt_texte->m_HJustify, pt_texte->m_VJustify, thickness, pt_texte->m_Italic, allow_bold ); } @@ -597,7 +607,8 @@ void PlotFilledAreas( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, ZONE_ /* Plot items type DRAWSEGMENT on layers allowed by aLayerMask */ -void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, DRAWSEGMENT* aSeg, int aLayerMask, +void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, + DRAWSEGMENT* aSeg, int aLayerMask, EDA_DRAW_MODE_T trace_mode ) { int thickness; @@ -607,7 +618,7 @@ void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, DRAWS return; if( trace_mode == LINE ) - thickness = aPlotOpts.m_PlotLineWidth; + thickness = aPlotOpts.GetLineWidth(); else thickness = aSeg->GetWidth(); @@ -650,15 +661,18 @@ void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, DRAWS } -void PCB_BASE_FRAME::Plot_Layer( PLOTTER* aPlotter, int Layer, EDA_DRAW_MODE_T trace_mode ) +void PlotBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, int Layer, + const PCB_PLOT_PARAMS& plot_opts ) { - const PCB_PLOT_PARAMS& plot_opts = GetPlotSettings(); + // Set the color and the text mode for this layer + aPlotter->SetColor( plot_opts.GetColor() ); + aPlotter->SetTextMode( plot_opts.GetTextMode() ); // Specify that the contents of the "Edges Pcb" layer are to be plotted // in addition to the contents of the currently specified layer. int layer_mask = GetLayerMask( Layer ); - if( !plot_opts.m_ExcludeEdgeLayer ) + if( !plot_opts.GetExcludeEdgeLayer() ) layer_mask |= EDGE_LAYER; switch( Layer ) @@ -679,59 +693,49 @@ void PCB_BASE_FRAME::Plot_Layer( PLOTTER* aPlotter, int Layer, EDA_DRAW_MODE_T t case LAYER_N_14: case LAYER_N_15: case LAST_COPPER_LAYER: - Plot_Standard_Layer( aPlotter, layer_mask, true, trace_mode, - plot_opts.m_SkipNPTH_Pads ); + // Skip NPTH pads on copper layers ( only if hole size == pad size ): + PlotStandardLayer( aBoard, aPlotter, layer_mask, plot_opts, true, true ); // Adding drill marks, if required and if the plotter is able to plot them: - if( plot_opts.m_DrillShapeOpt != PCB_PLOT_PARAMS::NO_DRILL_SHAPE ) - { - if( aPlotter->GetPlotterType() == PLOT_FORMAT_POST ) - PlotDrillMark( aPlotter, trace_mode, - plot_opts.m_DrillShapeOpt == - PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE ); - } + if( plot_opts.GetDrillMarksType() != PCB_PLOT_PARAMS::NO_DRILL_SHAPE ) + PlotDrillMarks( aBoard, aPlotter, plot_opts ); break; case SOLDERMASK_N_BACK: case SOLDERMASK_N_FRONT: - Plot_Standard_Layer( aPlotter, layer_mask, - plot_opts.m_PlotViaOnMaskLayer, trace_mode ); + PlotStandardLayer( aBoard, aPlotter, layer_mask, plot_opts, + plot_opts.GetPlotViaOnMaskLayer(), false ); break; case SOLDERPASTE_N_BACK: case SOLDERPASTE_N_FRONT: - Plot_Standard_Layer( aPlotter, layer_mask, false, trace_mode ); + PlotStandardLayer( aBoard, aPlotter, layer_mask, plot_opts, + false, false ); break; case SILKSCREEN_N_FRONT: case SILKSCREEN_N_BACK: - PlotSilkScreen( aPlotter, layer_mask, trace_mode ); + PlotSilkScreen( aBoard, aPlotter, layer_mask, plot_opts ); // Gerber: Subtract soldermask from silkscreen if enabled if( aPlotter->GetPlotterType() == PLOT_FORMAT_GERBER && plot_opts.GetSubtractMaskFromSilk() ) { if( Layer == SILKSCREEN_N_FRONT ) - { layer_mask = GetLayerMask( SOLDERMASK_N_FRONT ); - } else - { layer_mask = GetLayerMask( SOLDERMASK_N_BACK ); - } // Set layer polarity to negative aPlotter->SetLayerPolarity( false ); - Plot_Standard_Layer( aPlotter, layer_mask, - plot_opts.m_PlotViaOnMaskLayer, - trace_mode ); + PlotStandardLayer( aBoard, aPlotter, layer_mask, plot_opts, + plot_opts.GetPlotViaOnMaskLayer(), false ); } - break; default: - PlotSilkScreen( aPlotter, layer_mask, trace_mode ); + PlotSilkScreen( aBoard, aPlotter, layer_mask, plot_opts ); break; } } @@ -740,20 +744,18 @@ void PCB_BASE_FRAME::Plot_Layer( PLOTTER* aPlotter, int Layer, EDA_DRAW_MODE_T t /* Plot a copper layer or mask. * Silk screen layers are not plotted here. */ -void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, - int aLayerMask, - bool aPlotVia, - EDA_DRAW_MODE_T aPlotMode, - bool aSkipNPTH_Pads ) +void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, + long aLayerMask, const PCB_PLOT_PARAMS& plot_opts, + bool aPlotVia, bool aSkipNPTH_Pads ) { wxPoint pos; wxSize size; wxString msg; - const PCB_PLOT_PARAMS& plot_opts = GetPlotSettings(); + EDA_DRAW_MODE_T aPlotMode = plot_opts.GetMode(); // Plot pcb draw items. - for( BOARD_ITEM* item = m_Pcb->m_Drawings; item; item = item->Next() ) + for( BOARD_ITEM* item = aBoard->m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { @@ -777,13 +779,13 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, break; default: - wxMessageBox( wxT( "Plot_Standard_Layer() error : Unexpected Draw Type" ) ); + DisplayError( NULL, wxT( "Plot_Standard_Layer() error : Unexpected Draw Type" ) ); break; } } // Draw footprint shapes without pads (pads will plotted later) - for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() ) + for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) { for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() ) { @@ -802,7 +804,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, } // Plot footprint pads - for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() ) + for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) { for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() ) { @@ -885,7 +887,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, // Plot vias : if( aPlotVia ) { - for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() ) + for( TRACK* track = aBoard->m_Track; track; track = track->Next() ) { if( track->Type() != PCB_VIA_T ) continue; @@ -912,7 +914,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, // If the current layer is a solder mask, use the global mask // clearance for vias if( ( aLayerMask & ( SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT ) ) ) - via_margin = GetBoard()->GetDesignSettings().m_SolderMaskMargin; + via_margin = aBoard->GetDesignSettings().m_SolderMaskMargin; if( aLayerMask & ALL_CU_LAYERS ) { @@ -931,7 +933,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, } // Plot tracks (not vias) : - for( TRACK* track = m_Pcb->m_Track; track; track = track->Next() ) + for( TRACK* track = aBoard->m_Track; track; track = track->Next() ) { wxPoint end; @@ -949,7 +951,7 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, } // Plot zones (outdated, for old boards compatibility): - for( TRACK* track = m_Pcb->m_Zone; track; track = track->Next() ) + for( TRACK* track = aBoard->m_Zone; track; track = track->Next() ) { wxPoint end; @@ -964,9 +966,9 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, } // Plot filled ares - for( int ii = 0; ii < m_Pcb->GetAreaCount(); ii++ ) + for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ ) { - ZONE_CONTAINER* edge_zone = m_Pcb->GetArea( ii ); + ZONE_CONTAINER* edge_zone = aBoard->GetArea( ii ); if( ( ( 1 << edge_zone->GetLayer() ) & aLayerMask ) == 0 ) continue; @@ -975,85 +977,316 @@ void PCB_BASE_FRAME::Plot_Standard_Layer( PLOTTER* aPlotter, } } +/** Helper function to plot a single drill mark. It compensate and clamp + the drill mark size depending on the current plot options */ +static void PlotDrillMark( PLOTTER *aPlotter, PAD_SHAPE_T aDrillShape, + const wxPoint &aDrillPos, wxSize aDrillSize, + const wxSize &aPadSize, + double aOrientation, int aSmallDrill, + EDA_DRAW_MODE_T aTraceMode ) +{ + // Small drill marks have no significance when applied to slots + if( aSmallDrill && aDrillShape == PAD_ROUND ) + aDrillSize.x = std::min( aSmallDrill, aDrillSize.x ); + + // Round holes only have x diameter, slots have both + aDrillSize.x -= aPlotter->GetPlotWidthAdj(); + aDrillSize.x = Clamp( 1, aDrillSize.x, aPadSize.x - 1 ); + if( aDrillShape == PAD_OVAL ) + { + aDrillSize.y -= aPlotter->GetPlotWidthAdj(); + aDrillSize.y = Clamp( 1, aDrillSize.y, aPadSize.y - 1 ); + aPlotter->FlashPadOval( aDrillPos, aDrillSize, aOrientation, aTraceMode ); + } + else + aPlotter->FlashPadCircle( aDrillPos, aDrillSize.x, aTraceMode ); +} /** - * Function PlotDrillMark + * Function PlotDrillMarks * Draw a drill mark for pads and vias. * Must be called after all drawings, because it * redraw the drill mark on a pad or via, as a negative (i.e. white) shape in - * FILLED plot mode + * FILLED plot mode (for PS and PDF outputs) * @param aPlotter = the PLOTTER - * @param aTraceMode = the mode of plot (FILLED, SKETCH) * @param aSmallDrillShape = true to plot a small drill shape, false to plot * the actual drill shape */ -void PCB_BASE_FRAME::PlotDrillMark( PLOTTER* aPlotter, - EDA_DRAW_MODE_T aTraceMode, - bool aSmallDrillShape ) +void PlotDrillMarks( BOARD *aBoard, PLOTTER* aPlotter, + const PCB_PLOT_PARAMS& aPlotOpts ) { - wxPoint pos; - wxSize diam; - MODULE* Module; - D_PAD* pad; - TRACK* pts; + EDA_DRAW_MODE_T trace_mode = aPlotOpts.GetMode(); - const PCB_PLOT_PARAMS& plot_opts = GetPlotSettings(); + /* If small drills marks were requested prepare a clamp value to pass + to the helper function */ + int small_drill = (aPlotOpts.GetDrillMarksType() == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE) ? + SMALL_DRILL : 0; - if( aTraceMode == FILLED ) + /* In the filled trace mode drill marks are drawn white-on-black to scrape + the underlying pad. This works only for drivers supporting color change, + obviously... it means that: + - PS and PDF output is correct (i.e. you have a 'donut' pad) + - In HPGL you can't see them + - In gerbers you can't see them, too. This is arguably the right thing to + do since having drill marks and high speed drill stations is a sure + recipe for broken tools and angry manufacturers. If you *really* want them + you could start a layer with negative polarity to scrape the film. + - In DXF they go into the 'WHITE' layer. This could be useful. + */ + if( trace_mode == FILLED ) { aPlotter->SetColor( WHITE ); } - for( pts = m_Pcb->m_Track; pts != NULL; pts = pts->Next() ) + for( TRACK *pts = aBoard->m_Track; pts != NULL; pts = pts->Next() ) { if( pts->Type() != PCB_VIA_T ) continue; - pos = pts->m_Start; - - // It is quite possible that the real drill value is less then small drill value. - if( plot_opts.m_DrillShapeOpt == PCB_PLOT_PARAMS::SMALL_DRILL_SHAPE ) - diam.x = diam.y = MIN( SMALL_DRILL, pts->GetDrillValue() ); - else - diam.x = diam.y = pts->GetDrillValue(); - - diam.x -= aPlotter->GetPlotWidthAdj(); - diam.x = Clamp( 1, diam.x, pts->m_Width - 1 ); - aPlotter->FlashPadCircle( pos, diam.x, aTraceMode ); + PlotDrillMark( aPlotter, PAD_CIRCLE, + pts->m_Start, wxSize( pts->GetDrillValue(), 0 ), + wxSize( pts->m_Width, 0 ), 0, small_drill, + trace_mode ); } - for( Module = m_Pcb->m_Modules; Module != NULL; Module = Module->Next() ) + for( MODULE *Module = aBoard->m_Modules; Module != NULL; Module = Module->Next() ) { - for( pad = Module->m_Pads; pad != NULL; pad = pad->Next() ) + for( D_PAD *pad = Module->m_Pads; pad != NULL; pad = pad->Next() ) { if( pad->GetDrillSize().x == 0 ) continue; - // Output hole shapes: - pos = pad->GetPosition(); - - if( pad->GetDrillShape() == PAD_OVAL ) - { - diam = pad->GetDrillSize(); - diam.x -= aPlotter->GetPlotWidthAdj(); - diam.x = Clamp( 1, diam.x, pad->GetSize().x - 1 ); - diam.y -= aPlotter->GetPlotWidthAdj(); - diam.y = Clamp( 1, diam.y, pad->GetSize().y - 1 ); - aPlotter->FlashPadOval( pos, diam, pad->GetOrientation(), aTraceMode ); - } - else - { - // It is quite possible that the real pad drill value is less then small drill value. - diam.x = aSmallDrillShape ? MIN( SMALL_DRILL, pad->GetDrillSize().x ) : pad->GetDrillSize().x; - diam.x -= aPlotter->GetPlotWidthAdj(); - diam.x = Clamp( 1, diam.x, pad->GetSize().x - 1 ); - aPlotter->FlashPadCircle( pos, diam.x, aTraceMode ); - } + PlotDrillMark( aPlotter, pad->GetDrillShape(), + pad->GetPosition(), pad->GetDrillSize(), + pad->GetSize(), pad->GetOrientation(), + small_drill, trace_mode ); } } - if( aTraceMode == FILLED ) + if( trace_mode == FILLED ) { - aPlotter->SetColor( BLACK ); + aPlotter->SetColor( aPlotOpts.GetColor() ); } } + +/** Set up most plot options for plotting a board (especially the viewport) + * Important thing: + * page size is the 'drawing' page size, + * paper size is the physical page size + */ +static void PlotSetupPlotter( PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts, + const PAGE_INFO &aPageInfo, + const EDA_RECT &aBbbox, + const wxPoint &aOrigin, + const wxString &aFilename ) +{ + PAGE_INFO pageA4( wxT( "A4" ) ); + const PAGE_INFO* sheet_info; + double paperscale; // Page-to-paper ratio + wxSize paperSizeIU; + wxSize pageSizeIU( aPageInfo.GetSizeIU() ); + bool autocenter = false; + + /* Special options: to fit the sheet to an A4 sheet replace + the paper size. However there is a difference between + the autoscale and the a4paper option: + - Autoscale fits the board to the paper size + - A4paper fits the original paper size to an A4 sheet + - Both of them fit the board to an A4 sheet + */ + if( aPlotOpts->GetA4Output() ) // Fit paper to A4 + { + sheet_info = &pageA4; + paperSizeIU = pageA4.GetSizeIU(); + paperscale = (double) paperSizeIU.x / pageSizeIU.x; + autocenter = true; + } + else + { + sheet_info = &aPageInfo; + paperSizeIU = pageSizeIU; + paperscale = 1; + + // Need autocentering only if scale is not 1:1 + autocenter = (aPlotOpts->GetScale() != 1.0); + } + + wxPoint boardCenter = aBbbox.Centre(); + + double compound_scale; + wxSize boardSize = aBbbox.GetSize(); + + /* Fit to 80% of the page if asked; it could be that the board is empty, + * in this case regress to 1:1 scale */ + if( aPlotOpts->GetAutoScale() && boardSize.x > 0 && boardSize.y > 0 ) + { + double xscale = (paperSizeIU.x * 0.8) / boardSize.x; + double yscale = (paperSizeIU.y * 0.8) / boardSize.y; + + compound_scale = std::min( xscale, yscale ) * paperscale; + } + else + compound_scale = aPlotOpts->GetScale() * paperscale; + + + /* For the plot offset we have to keep in mind the auxiliary origin + too: if autoscaling is off we check that plot option (i.e. autoscaling + overrides auxiliary origin) */ + wxPoint offset( 0, 0); + + if( autocenter ) + { + offset.x = KiROUND( boardCenter.x - ( paperSizeIU.x / 2.0 ) / compound_scale ); + offset.y = KiROUND( boardCenter.y - ( paperSizeIU.y / 2.0 ) / compound_scale ); + } + else + { + if( aPlotOpts->GetUseAuxOrigin() ) + offset = aOrigin; + } + + /* Configure the plotter object with all the stuff computed and + most of that taken from the options */ + aPlotter->SetPageSettings( *sheet_info ); + aPlotter->SetPlotWidthAdj( aPlotOpts->GetWidthAdjust() ); + aPlotter->SetViewport( offset, IU_PER_DECIMILS, compound_scale, + aPlotOpts->GetMirror() ); + aPlotter->SetDefaultLineWidth( aPlotOpts->GetLineWidth() ); + aPlotter->SetCreator( wxT( "PCBNEW" ) ); + aPlotter->SetColorMode( true ); + aPlotter->SetFilename( aFilename ); + aPlotter->SetTextMode( aPlotOpts->GetTextMode() ); +} + +/** Prefill in black an area a little bigger than the board to prepare for the + * negative plot */ +static void FillNegativeKnockout(PLOTTER *aPlotter, const EDA_RECT &aBbbox ) +{ + static const int margin = 500; // Add a 0.5 inch margin around the board + aPlotter->SetNegative( true ); + aPlotter->SetColor( WHITE ); // Which will be plotted as black + aPlotter->Rect( wxPoint( aBbbox.GetX() - margin, aBbbox.GetY() - margin ), + wxPoint( aBbbox.GetRight() + margin, aBbbox.GetBottom() + margin ), + FILLED_SHAPE ); + aPlotter->SetColor( BLACK ); +} + +/** Calculate the effective size of HPGL pens and set them in the + * plotter object */ +static void ConfigureHPGLPenSizes( HPGL_PLOTTER *aPlotter, + PCB_PLOT_PARAMS *aPlotOpts ) +{ + /* Compute pen_dim (the value is given in mils) in pcb units, + with plot scale (if Scale is 2, pen diameter value is always m_HPGLPenDiam + so apparent pen diam is real pen diam / Scale */ + int pen_diam = KiROUND( aPlotOpts->GetHPGLPenDiameter() * IU_PER_MILS / + aPlotOpts->GetScale() ); + + // compute pen_overlay (value comes in mils) in pcb units with plot scale + if( aPlotOpts->GetHPGLPenOverlay() < 0 ) + aPlotOpts->SetHPGLPenOverlay( 0 ); + + if( aPlotOpts->GetHPGLPenOverlay() >= aPlotOpts->GetHPGLPenDiameter() ) + aPlotOpts->SetHPGLPenOverlay( aPlotOpts->GetHPGLPenDiameter() - 1 ); + + int pen_overlay = KiROUND( aPlotOpts->GetHPGLPenOverlay() * IU_PER_MILS / + aPlotOpts->GetScale() ); + + // Set HPGL-specific options and start + aPlotter->SetPenSpeed( aPlotOpts->GetHPGLPenSpeed() ); + aPlotter->SetPenNumber( aPlotOpts->GetHPGLPenNum() ); + aPlotter->SetPenOverlap( pen_overlay ); + aPlotter->SetPenDiameter( pen_diam ); +} + +/** Open a new plotfile using the options (and especially the format) + * specified in the options and prepare the page for plotting. + * Return the plotter object if OK, NULL if the file is not created + * (or has a problem) + */ +PLOTTER *StartPlotBoard( BOARD *aBoard, + PCB_PLOT_PARAMS *aPlotOpts, + const wxString& aFullFileName, + const wxString& aSheetDesc ) +{ + const PAGE_INFO& pageInfo = aBoard->GetPageSettings(); + EDA_RECT bbbox = aBoard->ComputeBoundingBox(); + wxPoint auxOrigin( aBoard->GetOriginAxisPosition() ); + FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); + + if( output_file == NULL ) + return NULL; + + // Create the plotter driver and set the few plotter specific + // options + PLOTTER *the_plotter = NULL; + switch( aPlotOpts->GetFormat() ) + { + case PLOT_FORMAT_DXF: + the_plotter = new DXF_PLOTTER(); + break; + + case PLOT_FORMAT_POST: + PS_PLOTTER* PS_plotter; + PS_plotter = new PS_PLOTTER(); + PS_plotter->SetScaleAdjust( aPlotOpts->GetFineScaleAdjustX(), + aPlotOpts->GetFineScaleAdjustY() ); + the_plotter = PS_plotter; + break; + + case PLOT_FORMAT_PDF: + the_plotter = new PDF_PLOTTER(); + break; + + case PLOT_FORMAT_HPGL: + HPGL_PLOTTER* HPGL_plotter; + HPGL_plotter = new HPGL_PLOTTER(); + + /* HPGL options are a little more convoluted to compute, so + they're split in an other function */ + ConfigureHPGLPenSizes( HPGL_plotter, aPlotOpts ); + the_plotter = HPGL_plotter; + break; + + case PLOT_FORMAT_GERBER: + the_plotter = new GERBER_PLOTTER(); + break; + + default: + wxASSERT( false ); + } + + if( the_plotter ) + { + // Compute the viewport and set the other options + PlotSetupPlotter( the_plotter, aPlotOpts, pageInfo, bbbox, auxOrigin, + aFullFileName ); + + if( the_plotter->StartPlot( output_file ) ) + { + /* When plotting a negative board: draw a black rectangle + * (background for plot board in white) and switch the current + * color to WHITE; note the the color inversion is actually done + * in the driver (if supported) */ + if( aPlotOpts->GetNegative() ) + FillNegativeKnockout( the_plotter, bbbox ); + + // Plot the frame reference if requested + if( aPlotOpts->GetPlotFrameRef() ) + PlotWorkSheet( the_plotter, aBoard->GetTitleBlock(), + aBoard->GetPageSettings(), + 1, 1, // Only one page + aSheetDesc, + aBoard->GetFileName() ); + + return the_plotter; + } + } + + // error in start_plot( ) or before + DisplayError( NULL, _("Error creating plot file")); + + if( the_plotter ) + delete the_plotter; + return NULL; +} diff --git a/pcbnew/plotcontroller.h b/pcbnew/plotcontroller.h new file mode 100644 index 0000000000..b4afbc77b4 --- /dev/null +++ b/pcbnew/plotcontroller.h @@ -0,0 +1,43 @@ +/** + * @file pcbnew/pcbplot.h + */ + +#ifndef PLOTCONTROLLER_H_ +#define PLOTCONTROLLER_H_ + +#include +#include + +class PLOTTER; +class BOARD; + +/** + * Batch plotter state object. Keeps the plot options and handles multiple + * plot requests + */ +class PLOT_CONTROLLER +{ +public: + PLOT_CONTROLLER( BOARD *aBoard ); + ~PLOT_CONTROLLER(); + PCB_PLOT_PARAMS *AccessPlotOpts() { return &m_plotOpts; } + bool IsPlotOpen() const { return m_plotter != NULL; } + void ClosePlot(); + bool OpenPlotfile( const wxString &aSuffix, PlotFormat aFormat, + const wxString &aSheetDesc ); + bool PlotLayer( int layer ); + +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; + + /// The board we're plotting + BOARD* m_board; +}; + +#endif + diff --git a/pcbnew/plotdxf.cpp b/pcbnew/plotdxf.cpp deleted file mode 100644 index b28ddbf733..0000000000 --- a/pcbnew/plotdxf.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file plotdxf.cpp - * @brief Plot DXF. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -bool PCB_BASE_FRAME::ExportToDxfFile( const wxString& aFullFileName, int aLayer, - EDA_DRAW_MODE_T aTraceMode ) -{ - LOCALE_IO toggle; - - const PCB_PLOT_PARAMS& plot_opts = GetPlotSettings(); - - FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); - - if( output_file == NULL ) - { - return false; - } - - DXF_PLOTTER* plotter = new DXF_PLOTTER(); - plotter->SetPageSettings( GetPageSettings() ); - plotter->SetViewport( wxPoint( 0, 0 ), IU_PER_DECIMILS, 1, 0 ); - plotter->SetCreator( wxT( "PCBNEW-DXF" ) ); - plotter->SetFilename( aFullFileName ); - plotter->StartPlot( output_file ); - - if( plot_opts.m_PlotFrameRef ) - PlotWorkSheet( plotter, GetScreen(), plot_opts.GetPlotLineWidth() ); - - Plot_Layer( plotter, aLayer, aTraceMode ); - plotter->EndPlot(); - delete plotter; - return true; -} diff --git a/pcbnew/plotgerb.cpp b/pcbnew/plotgerb.cpp deleted file mode 100644 index 21cd95081b..0000000000 --- a/pcbnew/plotgerb.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file plotgerb.cpp - * @brief Functions to plot a board in GERBER RS274X format. - */ - -/* Creates the output files, one per board layer: - * filenames are like xxxc.PHO and use the RS274X format - * Units = inches - * format 3.4, Leading zero omitted, Abs format - * format 3.4 uses the native Pcbnew units (1/10000 inch). - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -bool PCB_BASE_FRAME::ExportToGerberFile( const wxString& aFullFileName, int aLayer, - bool aPlotOriginIsAuxAxis, EDA_DRAW_MODE_T aTraceMode ) -{ - FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); - if( output_file == NULL ) - { - return false; - } - - PCB_PLOT_PARAMS plot_opts = GetPlotSettings(); - - wxPoint offset; - - // Calculate scaling from Pcbnew units (in 0.1 mil or 0.0001 inch) to gerber units - double scale = plot_opts.m_PlotScale; - - if( aPlotOriginIsAuxAxis ) - { - offset = GetOriginAxisPosition(); - } - else - { - offset.x = 0; - offset.y = 0; - } - - LOCALE_IO toggle; - - PLOTTER* plotter = new GERBER_PLOTTER(); - - // No mirror and scaling for gerbers! - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, 0 ); - plotter->SetDefaultLineWidth( plot_opts.m_PlotLineWidth ); - plotter->SetCreator( wxT( "PCBNEW-RS274X" ) ); - plotter->SetFilename( aFullFileName ); - - if( plotter->StartPlot( output_file ) ) - { - // Skip NPTH pads on copper layers - // ( only if hole size == pad size ): - if( (aLayer >= LAYER_N_BACK) && (aLayer <= LAYER_N_FRONT) ) - plot_opts.m_SkipNPTH_Pads = true; - - SetPlotSettings( plot_opts ); - - // Sheet refs on gerber CAN be useful... and they're always 1:1 - if( plot_opts.m_PlotFrameRef ) - PlotWorkSheet( plotter, GetScreen(), plot_opts.GetPlotLineWidth() ); - - Plot_Layer( plotter, aLayer, aTraceMode ); - - plotter->EndPlot(); - - plot_opts.m_SkipNPTH_Pads = false; - - SetPlotSettings( plot_opts ); - } - else // error in start_plot( ): failed opening a temporary file - { - wxMessageBox( _("Error when creating %s file: unable to create a temporary file")); - } - - delete plotter; - - return true; -} diff --git a/pcbnew/plothpgl.cpp b/pcbnew/plothpgl.cpp deleted file mode 100644 index 93fc748147..0000000000 --- a/pcbnew/plothpgl.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @file plothpgl.cpp - */ - -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 2012 KiCad Developers, see change_log.txt for contributors. - * Copyright (C) 2012 Dick Hollenbeck, dick@softplc.com - * - * 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 - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - - -bool PCB_BASE_FRAME::ExportToHpglFile( const wxString& aFullFileName, int aLayer, - EDA_DRAW_MODE_T aTraceMode ) -{ - wxSize boardSize; - wxPoint boardCenter; - bool center = false; - double scale; - wxPoint offset; - LOCALE_IO toggle; - FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); - - if( output_file == NULL ) - { - return false; - } - - PCB_PLOT_PARAMS plot_opts = GetPlotSettings(); - - // Compute pen_dim (from m_HPGLPenDiam in mils) in pcb units, - // with plot scale (if Scale is 2, pen diameter value is always m_HPGLPenDiam - // so apparent pen diam is real pen diam / Scale - int pen_diam = KiROUND( plot_opts.m_HPGLPenDiam * IU_PER_MILS / - plot_opts.m_PlotScale ); - - // compute pen_overlay (from m_HPGLPenOvr in mils) in pcb units - // with plot scale - if( plot_opts.m_HPGLPenOvr < 0 ) - plot_opts.m_HPGLPenOvr = 0; - - if( plot_opts.m_HPGLPenOvr >= plot_opts.m_HPGLPenDiam ) - plot_opts.m_HPGLPenOvr = plot_opts.m_HPGLPenDiam - 1; - - int pen_overlay = KiROUND( plot_opts.m_HPGLPenOvr * IU_PER_MILS / - plot_opts.m_PlotScale ); - - - if( plot_opts.m_PlotScale != 1.0 || plot_opts.m_AutoScale ) - { - // when scale != 1.0 we must calculate the position in page - // because actual position has no meaning - center = true; - } - - wxSize pageSizeIU = GetPageSizeIU(); - - // Calculate the center of the PCB - EDA_RECT bbbox = GetBoardBoundingBox(); - - boardSize = bbbox.GetSize(); - boardCenter = bbbox.Centre(); - - if( plot_opts.m_AutoScale ) // Optimum scale - { - // Fit to 80% of the page - double Xscale = ( ( pageSizeIU.x * 0.8 ) / boardSize.x ); - double Yscale = ( ( pageSizeIU.y * 0.8 ) / boardSize.y ); - scale = std::min( Xscale, Yscale ); - } - else - { - scale = plot_opts.m_PlotScale; - } - - // Calculate the page size offset. - if( center ) - { - offset.x = KiROUND( (double) boardCenter.x - - ( (double) pageSizeIU.x / 2.0 ) / scale ); - offset.y = KiROUND( (double) boardCenter.y - - ( (double) pageSizeIU.y / 2.0 ) / scale ); - } - else - { - offset.x = 0; - offset.y = 0; - } - - HPGL_PLOTTER* plotter = new HPGL_PLOTTER(); - - plotter->SetPageSettings( GetPageSettings() ); - - // why did we have to change these settings above? - SetPlotSettings( plot_opts ); - - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, - plot_opts.m_PlotMirror ); - plotter->SetDefaultLineWidth( plot_opts.m_PlotLineWidth ); - plotter->SetCreator( wxT( "PCBNEW-HPGL" ) ); - plotter->SetFilename( aFullFileName ); - plotter->SetPenSpeed( plot_opts.m_HPGLPenSpeed ); - plotter->SetPenNumber( plot_opts.m_HPGLPenNum ); - plotter->SetPenOverlap( pen_overlay ); - plotter->SetPenDiameter( pen_diam ); - plotter->StartPlot( output_file ); - - // The worksheet is not significant with scale!=1... It is with paperscale!=1, anyway - if( plot_opts.m_PlotFrameRef && !center ) - PlotWorkSheet( plotter, GetScreen(), plot_opts.GetPlotLineWidth() ); - - Plot_Layer( plotter, aLayer, aTraceMode ); - plotter->EndPlot(); - delete plotter; - - return true; -} diff --git a/pcbnew/plotps.cpp b/pcbnew/plotps.cpp deleted file mode 100644 index 4781c40fd8..0000000000 --- a/pcbnew/plotps.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @file plotps.cpp - * @brief Plot Postscript. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - - -/* Generate a PostScript file (*. ps) of the circuit layer. - * If layer < 0: all layers are plotted. - */ -bool PCB_BASE_FRAME::ExportToPostScriptFile( const wxString& aFullFileName, int aLayer, - bool aUseA4, EDA_DRAW_MODE_T aTraceMode ) -{ - const PAGE_INFO& pageInfo = GetPageSettings(); - PCB_PLOT_PARAMS plotOpts = GetPlotSettings(); - - wxSize paperSizeIU; - wxSize boardSize; - wxPoint boardCenter; - bool center = false; - double scale; - double paperscale; - wxPoint offset; - LOCALE_IO toggle; - PAGE_INFO pageA4( wxT( "A4" ) ); - - const PAGE_INFO* sheetPS; - - FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); - - if( output_file == NULL ) - { - return false; - } - - if( plotOpts.m_PlotScale != 1.0 || plotOpts.m_AutoScale ) - { - // when scale != 1.0 we must calculate the position in page - // because actual position has no meaning - center = true; - } - - // Set default line width - if( plotOpts.m_PlotLineWidth < 1 ) - plotOpts.m_PlotLineWidth = 1; - - wxSize pageSizeIU = GetPageSizeIU(); - - if( aUseA4 ) - { - sheetPS = &pageA4; - paperSizeIU = pageA4.GetSizeIU(); - paperscale = (double) paperSizeIU.x / pageSizeIU.x; - } - else - { - sheetPS = &pageInfo; - paperSizeIU = pageSizeIU; - paperscale = 1; - } - - EDA_RECT bbbox = GetBoardBoundingBox(); - - boardSize = bbbox.GetSize(); - boardCenter = bbbox.Centre(); - - if( plotOpts.m_AutoScale ) // Optimum scale - { - // Fit to 80% of the page - double Xscale = (paperSizeIU.x * 0.8) / boardSize.x; - double Yscale = (paperSizeIU.y * 0.8) / boardSize.y; - - scale = MIN( Xscale, Yscale ); - } - else - { - scale = plotOpts.m_PlotScale * paperscale; - } - - if( center ) - { - offset.x = KiROUND( (double) boardCenter.x - ( (double) paperSizeIU.x / 2.0 ) / scale ); - offset.y = KiROUND( (double) boardCenter.y - ( (double) paperSizeIU.y / 2.0 ) / scale ); - } - else - { - offset.x = 0; - offset.y = 0; - } - - PS_PLOTTER* plotter = new PS_PLOTTER(); - - plotter->SetPageSettings( *sheetPS ); - - // why did we have to change these settings? - SetPlotSettings( plotOpts ); - - plotter->SetScaleAdjust( plotOpts.m_FineScaleAdjustX, - plotOpts.m_FineScaleAdjustY ); - plotter->SetPlotWidthAdj( plotOpts.m_FineWidthAdjust ); - plotter->SetViewport( offset, IU_PER_DECIMILS, scale, - plotOpts.m_PlotMirror ); - plotter->SetDefaultLineWidth( plotOpts.m_PlotLineWidth ); - plotter->SetCreator( wxT( "PCBNEW-PS" ) ); - plotter->SetFilename( aFullFileName ); - plotter->SetPsTextMode( PSTEXTMODE_PHANTOM ); - plotter->StartPlot( output_file ); - - /* The worksheet is not significant with scale!=1... It is with paperscale!=1, anyway */ - if( plotOpts.m_PlotFrameRef && !center ) - PlotWorkSheet( plotter, GetScreen(), plotOpts.GetPlotLineWidth() ); - - // If plot a negative board: - // Draw a black rectangle (background for plot board in white) - // and switch the current color to WHITE - if( plotOpts.m_PlotPSNegative ) - { - int margin = 500; // Add a 0.5 inch margin around the board - plotter->SetNegative( true ); - plotter->SetColor( WHITE ); // Which will be plotted as black - plotter->Rect( wxPoint( bbbox.GetX() - margin, - bbbox.GetY() - margin ), - wxPoint( bbbox.GetRight() + margin, - bbbox.GetBottom() + margin ), - FILLED_SHAPE ); - plotter->SetColor( BLACK ); - } - - Plot_Layer( plotter, aLayer, aTraceMode ); - plotter->EndPlot(); - delete plotter; - - return true; -} diff --git a/pcbnew/printout_controler.cpp b/pcbnew/printout_controler.cpp index 8c753bca74..7ae272445d 100644 --- a/pcbnew/printout_controler.cpp +++ b/pcbnew/printout_controler.cpp @@ -285,7 +285,7 @@ void BOARD_PRINTOUT_CONTROLER::DrawPage() if( m_PrintParams.m_Print_Sheet_Ref ) m_Parent->TraceWorkSheet( dc, screen, m_PrintParams.m_PenDefaultSize, - IU_PER_MILS ); + IU_PER_MILS, m_Parent->GetScreenDesc() ); if( printMirror ) { diff --git a/pcbnew/scripting/pcbnew.i b/pcbnew/scripting/pcbnew.i index 393df32a8f..9484ab890f 100644 --- a/pcbnew/scripting/pcbnew.i +++ b/pcbnew/scripting/pcbnew.i @@ -52,8 +52,15 @@ { char ExceptionError[256]; sprintf(ExceptionError, "%s\n", TO_UTF8(e.errorText) ); - PyErr_SetString(PyExc_IOError,ExceptionError); - return NULL; + PyErr_SetString(PyExc_IOError,ExceptionError); + return NULL; + } + catch( std::exception &e ) + { + char ExceptionError[256]; + sprintf( ExceptionError, "%s\n", e.what() ); + PyErr_SetString(PyExc_IOError,ExceptionError); + return NULL; } catch( ... ) { @@ -88,7 +95,10 @@ #include #include #include - + + #include + #include + #include BOARD *GetBoard(); /* get current editor board */ %} @@ -120,6 +130,11 @@ %include %include +%include +%include +%include +%include + %include "board_item.i" %include @@ -136,4 +151,4 @@ %include "plugins.i" %include "units.i" - \ No newline at end of file + diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index c79e1c0ebf..64f1cd9633 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -72,7 +72,7 @@ static const double safetyMargin = 0.1; // see wxPcbStruct.h void PCB_EDIT_FRAME::ExportToSpecctra( wxCommandEvent& event ) { - wxString fullFileName = GetScreen()->GetFileName(); + wxString fullFileName = GetBoard()->GetFileName(); wxString path; wxString name; wxString ext; diff --git a/pcbnew/specctra_import.cpp b/pcbnew/specctra_import.cpp index 92f4555bc9..771a76c6f7 100644 --- a/pcbnew/specctra_import.cpp +++ b/pcbnew/specctra_import.cpp @@ -69,7 +69,7 @@ void PCB_EDIT_FRAME::ImportSpecctraSession( wxCommandEvent& event ) } */ - wxString fullFileName = GetScreen()->GetFileName(); + wxString fullFileName = GetBoard()->GetFileName(); wxString path; wxString name; wxString ext; diff --git a/pcbnew/tracepcb.cpp b/pcbnew/tracepcb.cpp index ec9e1a1c1d..76f4bca84c 100644 --- a/pcbnew/tracepcb.cpp +++ b/pcbnew/tracepcb.cpp @@ -68,7 +68,7 @@ void FOOTPRINT_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) GRSetDrawMode( DC, GR_COPY ); m_canvas->DrawBackGround( DC ); - TraceWorkSheet( DC, screen, 0, IU_PER_MILS ); + TraceWorkSheet( DC, screen, 0, IU_PER_MILS, wxEmptyString ); // Redraw the footprints for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() ) @@ -106,7 +106,8 @@ void PCB_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) m_canvas->DrawBackGround( DC ); - TraceWorkSheet( DC, GetScreen(), g_DrawDefaultLineThickness, IU_PER_MILS ); + TraceWorkSheet( DC, GetScreen(), g_DrawDefaultLineThickness, + IU_PER_MILS, wxEmptyString ); GetBoard()->Draw( m_canvas, DC, GR_OR | GR_ALLOW_HIGHCONTRAST); diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index 3dd711c60f..738d404cc3 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -183,7 +183,7 @@ int DIALOG_EXCHANGE_MODULE::Maj_ListeCmp( const wxString& reference, return 0; /* Build CMP file name by changing the extension of NetList filename */ - fn = m_Parent->GetScreen()->GetFileName(); + fn = m_Parent->GetBoard()->GetFileName(); fn.SetExt( ComponentFileExtension ); FichCmp = wxFopen( fn.GetFullPath(), wxT( "rt" ) ); @@ -621,7 +621,7 @@ void PCB_EDIT_FRAME::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) } /* Calculation file name by changing the extension name to NetList */ - fn = GetScreen()->GetFileName(); + fn = GetBoard()->GetFileName(); fn.SetExt( ComponentFileExtension ); wildcard = wxGetTranslation( ComponentFileWildcard );