diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index d6eb45749c..befdb20510 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -49,7 +49,6 @@ set(COMMON_SRCS common_plotSVG_functions.cpp confirm.cpp copy_to_clipboard.cpp - dcsvg.cpp dialog_shim.cpp displlst.cpp dlist.cpp diff --git a/common/common_plotSVG_functions.cpp b/common/common_plotSVG_functions.cpp index f7c340bf10..19002ed308 100644 --- a/common/common_plotSVG_functions.cpp +++ b/common/common_plotSVG_functions.cpp @@ -152,54 +152,26 @@ void SVG_PLOTTER::setSVGPlotStyle() switch( m_fillMode ) { case NO_FILL: - fputs( "fill-opacity:0.0;\n", outputFile ); + fputs( "fill-opacity:0.0; ", outputFile ); break; case FILLED_SHAPE: - fputs( "fill-opacity:1.0;\n", outputFile ); + fputs( "fill-opacity:1.0; ", outputFile ); break; case FILLED_WITH_BG_BODYCOLOR: - fputs( "fill-opacity:0.6;\n", outputFile ); + fputs( "fill-opacity:0.6; ", outputFile ); break; } - // output the pen color (RVB values in hex) and opacity - double pen_opacity = 1.0; // 0.0 (transparent to 1.0 (solid) - fprintf( outputFile, " stroke:#%6.6lX; stroke-opacity:%g;\n", - m_pen_rgb_color, pen_opacity ); - - // output the pen cap - int pen_cap = 0; // round, square, butt (currenly not used) - - switch( pen_cap ) - { - case 1: - fputs( "stroke-linecap:square; ", outputFile ); - break; - - case 2: - fputs( "stroke-linecap:butt; ", outputFile ); - break; - - case 0: - default: - fputs( "stroke-linecap:round; ", outputFile ); - } - - fputs( "stroke-linejoin:round; ", outputFile ); - - int pen_w = (int) userToDeviceSize( GetCurrentLineWidth() ); - fprintf( outputFile, - "stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">\n", - pen_w, - userToDeviceSize( plotOffset.x ), userToDeviceSize( plotOffset.y ), - plotScale, plotScale ); + double pen_w = userToDeviceSize( GetCurrentLineWidth() ); + fprintf( outputFile, "\nstroke:#%6.6lX; stroke-width:%g; stroke-opacity:1; \n", + m_pen_rgb_color, pen_w ); + fputs( "stroke-linecap:round; stroke-linejoin:round;\">\n", outputFile ); m_graphics_changed = false; } - /* Set the current line width (in IUs) for the next plot */ void SVG_PLOTTER::SetCurrentLineWidth( int width ) @@ -487,10 +459,16 @@ bool SVG_PLOTTER::StartPlot( FILE* fout ) // End of header fprintf( outputFile, " Picture generated by %s \n", TO_UTF8( creator ) ); - fputs( "\n", - outputFile ); - setSVGPlotStyle(); + // output the pen and brush color (RVB values in hex) and opacity + double opacity = 1.0; // 0.0 (transparent to 1.0 (solid) + fprintf( outputFile, + "\n", outputFile ); return true; } diff --git a/common/dcsvg.cpp b/common/dcsvg.cpp.unused similarity index 100% rename from common/dcsvg.cpp rename to common/dcsvg.cpp.unused diff --git a/pcbnew/class_mire.cpp b/pcbnew/class_mire.cpp index ccb7210cf3..340d2020f5 100644 --- a/pcbnew/class_mire.cpp +++ b/pcbnew/class_mire.cpp @@ -118,7 +118,9 @@ void PCB_TARGET::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE mode_color, if( DC->LogicalToDeviceXRel( width ) < 2 ) typeaff = LINE; - radius = m_Size / 4; + radius = m_Size / 3; + if( GetShape() ) // shape X + radius = m_Size / 2; switch( typeaff ) { @@ -142,9 +144,9 @@ void PCB_TARGET::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE mode_color, dx2 = 0; dy2 = radius; - if( m_Shape ) /* Form X */ + if( GetShape() ) // shape X { - dx1 = dy1 = ( radius * 7 ) / 5; + dx1 = dy1 = radius; dx2 = dx1; dy2 = -dy1; } diff --git a/pcbnew/class_pad_draw_functions.cpp b/pcbnew/class_pad_draw_functions.cpp index d139dddf62..ab938c3e62 100644 --- a/pcbnew/class_pad_draw_functions.cpp +++ b/pcbnew/class_pad_draw_functions.cpp @@ -78,7 +78,6 @@ PAD_DRAWINFO::PAD_DRAWINFO() void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDraw_mode, const wxPoint& aOffset ) { - EDA_COLOR_T color = ColorFromInt(0); // XXX EVIL (it will be ORed later) wxSize mask_margin; // margin (clearance) used for some non copper layers #ifdef SHOW_PADMASK_REAL_SIZE_AND_COLOR @@ -143,6 +142,7 @@ void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDraw_mode, else drawInfo.m_ShowPadFilled = false; + EDA_COLOR_T color = ColorFromInt(0); // XXX EVIL (it will be ORed later) if( m_layerMask & LAYER_FRONT ) { color = brd->GetVisibleElementColor( PAD_FR_VISIBLE ); @@ -154,7 +154,7 @@ void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDraw_mode, color = ColorFromInt( color | brd->GetVisibleElementColor( PAD_BK_VISIBLE ) ); } - if( color == 0 ) // Not on copper layer XXX EVIL check + if( color == 0 ) // Not on a visible copper layer XXX EVIL check { // If the pad in on only one tech layer, use the layer color else use DARKGRAY int mask_non_copper_layers = m_layerMask & ~ALL_CU_LAYERS; diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp index 2bcd8b1637..dca44c204a 100644 --- a/pcbnew/dialogs/dialog_SVG_print.cpp +++ b/pcbnew/dialogs/dialog_SVG_print.cpp @@ -35,27 +35,24 @@ #include #include #include +#include #include #include #include - #include - #include - // Keys for configuration -#define PLOTSVGMODECOLOR_KEY wxT( "PlotSVGModeColor" ) -#define PLOTSVGPAGESIZEOPT_KEY wxT( "PlotSVGPageOpt" ) -#define PLOTSVGPLOT_BRD_EDGE_KEY wxT( "PlotSVGBrdEdge" ) +#define PLOTSVGMODECOLOR_KEY wxT( "PlotSVGModeColor" ) +#define PLOTSVGPAGESIZEOPT_KEY wxT( "PlotSVGPageOpt" ) +#define PLOTSVGPLOT_BRD_EDGE_KEY wxT( "PlotSVGBrdEdge" ) // reasonnable values for default pen width -#define WIDTH_MAX_VALUE (2 *IU_PER_MM) -#define WIDTH_MIN_VALUE (0.05 *IU_PER_MM) +#define WIDTH_MAX_VALUE (2 * IU_PER_MM) +#define WIDTH_MIN_VALUE (0.05 * IU_PER_MM) // Local variables: -static PRINT_PARAMETERS s_Parameters; static long s_SelectedLayers = LAYER_BACK | LAYER_FRONT | SILKSCREEN_LAYER_FRONT | SILKSCREEN_LAYER_BACK; @@ -66,42 +63,45 @@ static long s_SelectedLayers = LAYER_BACK | LAYER_FRONT | DIALOG_SVG_PRINT::DIALOG_SVG_PRINT( EDA_DRAW_FRAME* parent ) : DIALOG_SVG_PRINT_base( parent ) { - m_Parent = (PCB_BASE_FRAME*) parent; - m_Config = wxGetApp().GetSettings(); + m_Parent = (PCB_BASE_FRAME*) parent; + m_Config = wxGetApp().GetSettings(); initDialog(); GetSizer()->SetSizeHints( this ); Centre(); - m_buttonBoard->SetDefault(); } +bool DIALOG_SVG_PRINT::m_printMirror = false; +bool DIALOG_SVG_PRINT::m_oneFileOnly = false; -void DIALOG_SVG_PRINT::initDialog( ) +void DIALOG_SVG_PRINT::initDialog() { - SetFocus(); // Make ESC key working - if( m_Config ) { - m_Config->Read( PLOTSVGMODECOLOR_KEY, &s_Parameters.m_Print_Black_and_White ); + m_Config->Read( PLOTSVGMODECOLOR_KEY, &m_printBW, false ); long ltmp; m_Config->Read( PLOTSVGPAGESIZEOPT_KEY, <mp, 0 ); m_rbSvgPageSizeOpt->SetSelection( ltmp ); m_Config->Read( PLOTSVGPLOT_BRD_EDGE_KEY, <mp, 1 ); - m_PrintBoardEdgesCtrl->SetValue(ltmp ); + m_PrintBoardEdgesCtrl->SetValue( ltmp ); } - if( s_Parameters.m_Print_Black_and_White ) + if( m_printBW ) m_ModeColorOption->SetSelection( 1 ); else m_ModeColorOption->SetSelection( 0 ); - s_Parameters.m_PenDefaultSize = g_DrawDefaultLineThickness; + m_printMirrorOpt->SetValue( m_printMirror ); + m_rbFileOpt->SetSelection( m_oneFileOnly ? 1 : 0 ); + + AddUnitSymbol( *m_TextPenWidth, g_UserUnit ); m_DialogDefaultPenSize->SetValue( - ReturnStringFromValue( g_UserUnit, s_Parameters.m_PenDefaultSize ) ); + ReturnStringFromValue( g_UserUnit, g_DrawDefaultLineThickness ) ); // Create layers list - BOARD* board = m_Parent->GetBoard(); - int layer; + BOARD* board = m_Parent->GetBoard(); + int layer; + for( layer = 0; layer < NB_LAYERS; ++layer ) { if( !board->IsLayerEnabled( layer ) ) @@ -110,20 +110,23 @@ void DIALOG_SVG_PRINT::initDialog( ) m_BoxSelectLayer[layer] = new wxCheckBox( this, -1, board->GetLayerName( layer ) ); } + // Add wxCheckBoxes in layers lists dialog - // List layers in same order than in setup layers dialog + // List layers in same order than in setup layers dialog // (Front or Top to Back or Bottom) - DECLARE_LAYERS_ORDER_LIST(layersOrder); + DECLARE_LAYERS_ORDER_LIST( layersOrder ); + for( int layer_idx = 0; layer_idx < NB_LAYERS; ++layer_idx ) { layer = layersOrder[layer_idx]; - wxASSERT(layer < NB_LAYERS); + wxASSERT( layer < NB_LAYERS ); if( m_BoxSelectLayer[layer] == NULL ) continue; long mask = 1 << layer; + if( mask & s_SelectedLayers ) m_BoxSelectLayer[layer]->SetValue( true ); @@ -143,11 +146,13 @@ void DIALOG_SVG_PRINT::initDialog( ) { wxString layerKey; - for( int layer = 0; layerRead( layerKey, &option ) ) @@ -159,82 +164,77 @@ void DIALOG_SVG_PRINT::initDialog( ) void DIALOG_SVG_PRINT::SetPenWidth() { - s_Parameters.m_PenDefaultSize = ReturnValueFromTextCtrl( *m_DialogDefaultPenSize ); + int pensize = ReturnValueFromTextCtrl( *m_DialogDefaultPenSize ); - if( s_Parameters.m_PenDefaultSize > WIDTH_MAX_VALUE ) + if( pensize > WIDTH_MAX_VALUE ) { - s_Parameters.m_PenDefaultSize = WIDTH_MAX_VALUE; + pensize = WIDTH_MAX_VALUE; } - if( s_Parameters.m_PenDefaultSize < WIDTH_MIN_VALUE ) + if( pensize < WIDTH_MIN_VALUE ) { - s_Parameters.m_PenDefaultSize = WIDTH_MIN_VALUE; + pensize = WIDTH_MIN_VALUE; } - g_DrawDefaultLineThickness = s_Parameters.m_PenDefaultSize; - m_DialogDefaultPenSize->SetValue( - ReturnStringFromValue( g_UserUnit, s_Parameters.m_PenDefaultSize ) ); + g_DrawDefaultLineThickness = pensize; + m_DialogDefaultPenSize->SetValue( ReturnStringFromValue( g_UserUnit, pensize ) ); } - -void DIALOG_SVG_PRINT::PrintSVGDoc( bool aPrintAll ) +void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) { - wxFileName fn; - wxString msg; + wxFileName fn; + wxString msg; - s_Parameters.m_Print_Black_and_White = m_ModeColorOption->GetSelection(); + m_printMirror = m_printMirrorOpt->GetValue(); + m_printBW = m_ModeColorOption->GetSelection(); SetPenWidth(); - PCB_SCREEN* screen = m_Parent->GetScreen(); - - if( aPrintAll ) - m_PrintMaskLayer = 0xFFFFFFFF; - else - m_PrintMaskLayer = 0; - - if( m_PrintBoardEdgesCtrl->IsChecked() ) - m_PrintMaskLayer |= EDGE_LAYER; - else - m_PrintMaskLayer &= ~EDGE_LAYER; + // Build layers mask + int printMaskLayer = 0; for( int layer = 0; layerGetValue() ) + printMaskLayer |= 1 << layer; + } - if( !aPrintAll && !m_BoxSelectLayer[layer]->GetValue() ) + for( int layer = 0; layerGetValue(); - if( !fn.IsOk() ) - { - fn = m_Parent->GetBoard()->GetFileName(); - } - if( aPrintAll ) + if( !fn.IsOk() ) + fn = m_Parent->GetBoard()->GetFileName(); + + if( aOnlyOneFile ) + { + m_PrintMaskLayer = printMaskLayer; fn.SetName( fn.GetName() + wxT( "-brd" ) ); + } else { - wxString extraname = m_Parent->GetBoard()->GetLayerName( layer, false ); - extraname.Trim(); // remove leading and trailing spaces if any - extraname.Trim(false); - fn.SetName( fn.GetName() + wxT( "-" ) + extraname ); - - m_PrintMaskLayer = 1 << layer; - if( m_PrintBoardEdgesCtrl->IsChecked() ) - m_PrintMaskLayer |= EDGE_LAYER; + m_PrintMaskLayer = currlayer_mask; + wxString suffix = m_Parent->GetBoard()->GetLayerName( layer, false ); + suffix.Trim(); // remove leading and trailing spaces if any + suffix.Trim( false ); + fn.SetName( fn.GetName() + wxT( "-" ) + suffix ); } fn.SetExt( wxT( "svg" ) ); - bool success = DrawPage( fn.GetFullPath(), screen ); - msg = _( "Create file " ) + fn.GetFullPath(); - if( !success ) - msg += _( " error" ); - msg += wxT( "\n" ); + if( m_PrintBoardEdgesCtrl->IsChecked() ) + m_PrintMaskLayer |= EDGE_LAYER; + + if( CreateSVGFile( fn.GetFullPath() ) ) + msg.Printf( _( "Plot: %s OK\n" ), GetChars( fn.GetFullPath() ) ); + else // Error + msg.Printf( _( "** Unable to create %s **\n" ), GetChars( fn.GetFullPath() ) ); m_MessagesBox->AppendText( msg ); - if( aPrintAll ) + if( aOnlyOneFile ) break; } } @@ -243,83 +243,61 @@ void DIALOG_SVG_PRINT::PrintSVGDoc( bool aPrintAll ) /* * Actual print function. */ -bool DIALOG_SVG_PRINT::DrawPage( const wxString& FullFileName, - BASE_SCREEN* screen ) +bool DIALOG_SVG_PRINT::CreateSVGFile( const wxString& aFullFileName ) { - LOCALE_IO toggle; - int tmpzoom; - wxPoint tmp_startvisu; - wxPoint old_org; - bool success = true; + BOARD* brd = m_Parent->GetBoard(); - // Change frames and local settings - tmp_startvisu = screen->m_StartVisu; - tmpzoom = screen->GetZoom(); - old_org = screen->m_DrawOrg; + PCB_PLOT_PARAMS m_plotOpts; - screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0; - screen->m_StartVisu.x = screen->m_StartVisu.y = 0; + m_plotOpts.SetPlotFrameRef( PrintPageRef() ); + m_plotOpts.SetDrillMarksType( PCB_PLOT_PARAMS::FULL_DRILL_SHAPE ); + m_plotOpts.SetMirror( m_printMirror ); + m_plotOpts.SetFormat( PLOT_FORMAT_SVG ); + EDA_COLOR_T color = BLACK; + m_plotOpts.SetReferenceColor( color ); + m_plotOpts.SetValueColor( color ); - screen->SetScalingFactor( 1.0 ); + PAGE_INFO pageInfo = brd->GetPageSettings(); + wxPoint axisorigin = brd->GetOriginAxisPosition(); - double dpi = IU_PER_MILS * 1000.0; - - EDA_DRAW_PANEL* panel = m_Parent->GetCanvas(); - - // paper pageSize is in internal units, either nanometers or deci-mils - EDA_RECT rect; - rect.SetSize( m_Parent->GetPageSizeIU() ); if( PageIsBoardBoundarySize() ) { - rect = m_Parent->GetBoard()->ComputeBoundingBox(); + EDA_RECT bbox = brd->ComputeBoundingBox(); + PAGE_INFO currpageInfo = brd->GetPageSettings(); + currpageInfo.SetWidthMils( bbox.GetWidth() / IU_PER_MILS ); + currpageInfo.SetHeightMils( bbox.GetHeight() / IU_PER_MILS ); + brd->SetPageSettings( currpageInfo ); + m_plotOpts.SetUseAuxOrigin( true ); + wxPoint origin = bbox.GetOrigin(); + brd->SetOriginAxisPosition( origin ); } - KicadSVGFileDC dc( FullFileName, rect.GetOrigin(), rect.GetSize(), dpi ); + LOCALE_IO toggle; + SVG_PLOTTER* plotter = (SVG_PLOTTER*) StartPlotBoard( brd, + &m_plotOpts, aFullFileName, + wxEmptyString ); - EDA_RECT tmp = *panel->GetClipBox(); - GRResetPenAndBrush( &dc ); - GRForceBlackPen( s_Parameters.m_Print_Black_and_White ); - s_Parameters.m_DrillShapeOpt = PRINT_PARAMETERS::FULL_DRILL_SHAPE; + if( plotter ) + { + plotter->SetColorMode( m_ModeColorOption->GetSelection() == 0 ); + PlotStandardLayer( brd, plotter, m_PrintMaskLayer, m_plotOpts, true, false ); + // Adding drill marks, if required and if the plotter is able to plot them: + if( m_plotOpts.GetDrillMarksType() != PCB_PLOT_PARAMS::NO_DRILL_SHAPE ) + PlotDrillMarks( brd, plotter, m_plotOpts ); + } - // Set clip box to the max size - #define MAX_VALUE (INT_MAX/2) // MAX_VALUE is the max we can use in an integer - // and that allows calculations without overflow - panel->SetClipBox( EDA_RECT( wxPoint( 0, 0 ), wxSize( MAX_VALUE, MAX_VALUE ) ) ); + plotter->EndPlot(); + delete plotter; + brd->SetOriginAxisPosition( axisorigin ); + brd->SetPageSettings( pageInfo ); - screen->m_IsPrinting = true; - - EDA_COLOR_T bg_color = g_DrawBgColor; - g_DrawBgColor = WHITE; - - if( PrintPageRef() ) - 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; - - screen->m_IsPrinting = false; - panel->SetClipBox( tmp ); - - GRForceBlackPen( false ); - - screen->m_StartVisu = tmp_startvisu; - screen->m_DrawOrg = old_org; - screen->SetZoom( tmpzoom ); - - return success; + return true; } - -void DIALOG_SVG_PRINT::OnButtonPrintBoardClick( wxCommandEvent& event ) +void DIALOG_SVG_PRINT::OnButtonPlot( wxCommandEvent& event ) { - PrintSVGDoc( true ); -} - - -void DIALOG_SVG_PRINT::OnButtonPrintSelectedClick( wxCommandEvent& event ) -{ - PrintSVGDoc( false ); + m_oneFileOnly = m_rbFileOpt->GetSelection() == 1; + ExportSVGFile( m_oneFileOnly ); } @@ -332,21 +310,26 @@ void DIALOG_SVG_PRINT::OnButtonCancelClick( wxCommandEvent& event ) void DIALOG_SVG_PRINT::OnCloseWindow( wxCloseEvent& event ) { SetPenWidth(); - s_Parameters.m_Print_Black_and_White = m_ModeColorOption->GetSelection(); + m_printBW = m_ModeColorOption->GetSelection(); + m_oneFileOnly = m_rbFileOpt->GetSelection() == 1; + if( m_Config ) { - m_Config->Write( PLOTSVGMODECOLOR_KEY, s_Parameters.m_Print_Black_and_White ); + m_Config->Write( PLOTSVGMODECOLOR_KEY, m_printBW ); m_Config->Write( PLOTSVGPAGESIZEOPT_KEY, m_rbSvgPageSizeOpt->GetSelection() ); m_Config->Write( PLOTSVGPLOT_BRD_EDGE_KEY, m_PrintBoardEdgesCtrl->GetValue() ); wxString layerKey; - for( int layer = 0; layerWrite( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); } } + EndModal( 0 ); } diff --git a/pcbnew/dialogs/dialog_SVG_print.h b/pcbnew/dialogs/dialog_SVG_print.h index 236272e8b4..ac0b20d4a5 100644 --- a/pcbnew/dialogs/dialog_SVG_print.h +++ b/pcbnew/dialogs/dialog_SVG_print.h @@ -18,6 +18,10 @@ private: wxConfig* m_Config; long m_PrintMaskLayer; wxCheckBox* m_BoxSelectLayer[32]; + bool m_printBW; + // Static member to store options + static bool m_printMirror; + static bool m_oneFileOnly; public: DIALOG_SVG_PRINT( EDA_DRAW_FRAME* parent ); @@ -26,11 +30,10 @@ public: private: void OnCloseWindow( wxCloseEvent& event ); void initDialog( ); - void OnButtonPrintSelectedClick( wxCommandEvent& event ); - void OnButtonPrintBoardClick( wxCommandEvent& event ); + void OnButtonPlot( wxCommandEvent& event ); void OnButtonCancelClick( wxCommandEvent& event ); void SetPenWidth(); - void PrintSVGDoc( bool aPrintAll ); + void ExportSVGFile( bool aOnlyOneFile ); bool PageIsBoardBoundarySize() { return m_rbSvgPageSizeOpt->GetSelection() == 2; @@ -39,7 +42,7 @@ private: { return m_rbSvgPageSizeOpt->GetSelection() == 0; } - bool DrawPage( const wxString& FullFileName, BASE_SCREEN* screen ); + bool CreateSVGFile( const wxString& FullFileName ); }; diff --git a/pcbnew/dialogs/dialog_SVG_print_base.cpp b/pcbnew/dialogs/dialog_SVG_print_base.cpp index 21b8b5349c..aa5ae71e73 100644 --- a/pcbnew/dialogs/dialog_SVG_print_base.cpp +++ b/pcbnew/dialogs/dialog_SVG_print_base.cpp @@ -40,7 +40,7 @@ DIALOG_SVG_PRINT_base::DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id, c m_TextPenWidth = new wxStaticText( this, wxID_ANY, _("Default pen size"), wxDefaultPosition, wxDefaultSize, 0 ); m_TextPenWidth->Wrap( -1 ); - sbOptionsSizer->Add( m_TextPenWidth, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + sbOptionsSizer->Add( m_TextPenWidth, 0, wxRIGHT|wxLEFT, 5 ); m_DialogDefaultPenSize = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_DialogDefaultPenSize->SetToolTip( _("Selection of the pen size used to draw items which have no pen size speicfied.") ); @@ -53,37 +53,43 @@ DIALOG_SVG_PRINT_base::DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id, c m_ModeColorOption->SetSelection( 1 ); m_ModeColorOption->SetToolTip( _("Choose if you want to draw the sheet like it appears on screen,\nor in black and white mode, better to print it when using black and white printers") ); - sbOptionsSizer->Add( m_ModeColorOption, 0, wxALL|wxEXPAND, 5 ); + sbOptionsSizer->Add( m_ModeColorOption, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); wxString m_rbSvgPageSizeOptChoices[] = { _("Full page with frame ref"), _("Current page size"), _("Board area only") }; int m_rbSvgPageSizeOptNChoices = sizeof( m_rbSvgPageSizeOptChoices ) / sizeof( wxString ); m_rbSvgPageSizeOpt = new wxRadioBox( this, wxID_ANY, _("SVG Page Size"), wxDefaultPosition, wxDefaultSize, m_rbSvgPageSizeOptNChoices, m_rbSvgPageSizeOptChoices, 1, wxRA_SPECIFY_COLS ); m_rbSvgPageSizeOpt->SetSelection( 0 ); - sbOptionsSizer->Add( m_rbSvgPageSizeOpt, 0, wxALL|wxEXPAND, 5 ); + sbOptionsSizer->Add( m_rbSvgPageSizeOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_PrintBoardEdgesCtrl = new wxCheckBox( this, wxID_ANY, _("Print board edges"), wxDefaultPosition, wxDefaultSize, 0 ); + m_PrintBoardEdgesCtrl->SetValue(true); m_PrintBoardEdgesCtrl->SetToolTip( _("Print (or not) the edges layer on others layers") ); - sbOptionsSizer->Add( m_PrintBoardEdgesCtrl, 0, wxALL, 5 ); + sbOptionsSizer->Add( m_PrintBoardEdgesCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_printMirrorOpt = new wxCheckBox( this, wxID_ANY, _("Print mirror"), wxDefaultPosition, wxDefaultSize, 0 ); + sbOptionsSizer->Add( m_printMirrorOpt, 0, wxRIGHT|wxLEFT, 5 ); - bUpperSizer->Add( sbOptionsSizer, 1, wxEXPAND, 5 ); + bUpperSizer->Add( sbOptionsSizer, 0, wxEXPAND, 5 ); wxBoxSizer* bButtonsSizer; bButtonsSizer = new wxBoxSizer( wxVERTICAL ); - m_buttonPrintSelected = new wxButton( this, wxID_PRINT_CURRENT, _("Print Selected"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonPrintSelected->SetDefault(); - bButtonsSizer->Add( m_buttonPrintSelected, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + wxString m_rbFileOptChoices[] = { _("One file per layer"), _("All in one file") }; + int m_rbFileOptNChoices = sizeof( m_rbFileOptChoices ) / sizeof( wxString ); + m_rbFileOpt = new wxRadioBox( this, wxID_ANY, _("wxRadioBox"), wxDefaultPosition, wxDefaultSize, m_rbFileOptNChoices, m_rbFileOptChoices, 1, wxRA_SPECIFY_COLS ); + m_rbFileOpt->SetSelection( 0 ); + bButtonsSizer->Add( m_rbFileOpt, 0, wxALL, 5 ); - m_buttonBoard = new wxButton( this, wxID_PRINT_BOARD, _("Print Board"), wxDefaultPosition, wxDefaultSize, 0 ); - bButtonsSizer->Add( m_buttonBoard, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + m_buttonCreateFile = new wxButton( this, wxID_PRINT_BOARD, _("Plot"), wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_buttonCreateFile, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Quit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); bButtonsSizer->Add( m_buttonQuit, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - bUpperSizer->Add( bButtonsSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bUpperSizer->Add( bButtonsSizer, 0, wxEXPAND, 5 ); bMainSizer->Add( bUpperSizer, 0, wxEXPAND, 5 ); @@ -113,8 +119,7 @@ DIALOG_SVG_PRINT_base::DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id, c // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_SVG_PRINT_base::OnCloseWindow ) ); - m_buttonPrintSelected->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPrintSelectedClick ), NULL, this ); - m_buttonBoard->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPrintBoardClick ), NULL, this ); + m_buttonCreateFile->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPlot ), NULL, this ); m_buttonQuit->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonCancelClick ), NULL, this ); } @@ -122,8 +127,7 @@ DIALOG_SVG_PRINT_base::~DIALOG_SVG_PRINT_base() { // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_SVG_PRINT_base::OnCloseWindow ) ); - m_buttonPrintSelected->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPrintSelectedClick ), NULL, this ); - m_buttonBoard->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPrintBoardClick ), NULL, this ); + m_buttonCreateFile->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonPlot ), NULL, this ); m_buttonQuit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SVG_PRINT_base::OnButtonCancelClick ), NULL, this ); } diff --git a/pcbnew/dialogs/dialog_SVG_print_base.fbp b/pcbnew/dialogs/dialog_SVG_print_base.fbp index 9c13aec67c..a5e7b103e4 100644 --- a/pcbnew/dialogs/dialog_SVG_print_base.fbp +++ b/pcbnew/dialogs/dialog_SVG_print_base.fbp @@ -42,7 +42,7 @@ -1,350 DIALOG_SVG_PRINT_base - 507,375 + 507,420 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER Create SVG file @@ -145,7 +145,7 @@ 5 wxEXPAND - 1 + 0 wxID_ANY Print SVG options: @@ -156,7 +156,7 @@ 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -330,7 +330,7 @@ 5 - wxALL|wxEXPAND + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT 0 1 @@ -420,7 +420,7 @@ 5 - wxALL|wxEXPAND + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT 0 1 @@ -510,7 +510,7 @@ 5 - wxALL + wxBOTTOM|wxRIGHT|wxLEFT 0 1 @@ -526,7 +526,7 @@ 1 0 - 0 + 1 1 1 @@ -596,22 +596,11 @@ - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - - bButtonsSizer - wxVERTICAL - none 5 - wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND + wxRIGHT|wxLEFT 0 - + 1 1 1 @@ -625,10 +614,10 @@ 1 0 + 0 1 1 - 1 0 Dock 0 @@ -639,8 +628,8 @@ 0 0 - wxID_PRINT_CURRENT - Print Selected + wxID_ANY + Print mirror 0 @@ -648,7 +637,7 @@ 0 1 - m_buttonPrintSelected + m_printMirrorOpt 1 @@ -669,7 +658,107 @@ - OnButtonPrintSelectedClick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bButtonsSizer + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "One file per layer" "All in one file" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + wxRadioBox + 1 + + 0 + + + 0 + + 1 + m_rbFileOpt + 1 + + + protected + 1 + + Resizable + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + @@ -687,6 +776,7 @@ + @@ -728,7 +818,7 @@ 0 0 wxID_PRINT_BOARD - Print Board + Plot 0 @@ -736,7 +826,7 @@ 0 1 - m_buttonBoard + m_buttonCreateFile 1 @@ -757,7 +847,7 @@ - OnButtonPrintBoardClick + OnButtonPlot @@ -816,7 +906,7 @@ 0 0 wxID_CANCEL - Quit + Close 0 diff --git a/pcbnew/dialogs/dialog_SVG_print_base.h b/pcbnew/dialogs/dialog_SVG_print_base.h index 35ab66fa1a..7322db2fbc 100644 --- a/pcbnew/dialogs/dialog_SVG_print_base.h +++ b/pcbnew/dialogs/dialog_SVG_print_base.h @@ -37,8 +37,7 @@ class DIALOG_SVG_PRINT_base : public wxDialog protected: enum { - wxID_PRINT_CURRENT = 1000, - wxID_PRINT_BOARD + wxID_PRINT_BOARD = 1000 }; wxStaticBoxSizer* m_CopperLayersBoxSizer; @@ -48,8 +47,9 @@ class DIALOG_SVG_PRINT_base : public wxDialog wxRadioBox* m_ModeColorOption; wxRadioBox* m_rbSvgPageSizeOpt; wxCheckBox* m_PrintBoardEdgesCtrl; - wxButton* m_buttonPrintSelected; - wxButton* m_buttonBoard; + wxCheckBox* m_printMirrorOpt; + wxRadioBox* m_rbFileOpt; + wxButton* m_buttonCreateFile; wxButton* m_buttonQuit; wxStaticText* m_staticText1; wxTextCtrl* m_FileNameCtrl; @@ -58,14 +58,13 @@ class DIALOG_SVG_PRINT_base : public wxDialog // Virtual event handlers, overide them in your derived class virtual void OnCloseWindow( wxCloseEvent& event ) { event.Skip(); } - virtual void OnButtonPrintSelectedClick( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonPrintBoardClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnButtonPlot( wxCommandEvent& event ) { event.Skip(); } virtual void OnButtonCancelClick( wxCommandEvent& event ) { event.Skip(); } public: - DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create SVG file"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 507,375 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create SVG file"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 507,420 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DIALOG_SVG_PRINT_base(); }; diff --git a/pcbnew/dialogs/dialog_gendrill_base.cpp b/pcbnew/dialogs/dialog_gendrill_base.cpp index c54d217418..d3a326a80b 100644 --- a/pcbnew/dialogs/dialog_gendrill_base.cpp +++ b/pcbnew/dialogs/dialog_gendrill_base.cpp @@ -57,7 +57,7 @@ DIALOG_GENDRILL_BASE::DIALOG_GENDRILL_BASE( wxWindow* parent, wxWindowID id, con wxString m_Choice_Drill_MapChoices[] = { _("None"), _("Drill map (HPGL)"), _("Drill map (PostScript)"), _("Drill map (Gerber)"), _("Drill map (DXF)"), _("Drill map (SVG)") }; int m_Choice_Drill_MapNChoices = sizeof( m_Choice_Drill_MapChoices ) / sizeof( wxString ); - m_Choice_Drill_Map = new wxRadioBox( this, wxID_ANY, _("Drill Sheet:"), wxDefaultPosition, wxDefaultSize, m_Choice_Drill_MapNChoices, m_Choice_Drill_MapChoices, 1, wxRA_SPECIFY_COLS ); + m_Choice_Drill_Map = new wxRadioBox( this, wxID_ANY, _("Drill Map:"), wxDefaultPosition, wxDefaultSize, m_Choice_Drill_MapNChoices, m_Choice_Drill_MapChoices, 1, wxRA_SPECIFY_COLS ); m_Choice_Drill_Map->SetSelection( 0 ); m_Choice_Drill_Map->SetToolTip( _("Creates a drill map in PS, HPGL or other formats") ); diff --git a/pcbnew/dialogs/dialog_gendrill_base.fbp b/pcbnew/dialogs/dialog_gendrill_base.fbp index bdb8933d37..4895e56de9 100644 --- a/pcbnew/dialogs/dialog_gendrill_base.fbp +++ b/pcbnew/dialogs/dialog_gendrill_base.fbp @@ -504,7 +504,7 @@ 0 0 wxID_ANY - Drill Sheet: + Drill Map: 1 0 diff --git a/pcbnew/menubar_pcbframe.cpp b/pcbnew/menubar_pcbframe.cpp index 41d7b377de..6b36d1a269 100644 --- a/pcbnew/menubar_pcbframe.cpp +++ b/pcbnew/menubar_pcbframe.cpp @@ -216,8 +216,8 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() // Create SVG file AddMenuItem( filesMenu, ID_GEN_PLOT_SVG, - _( "Print SV&G" ), - _( "Plot board in Scalable Vector Graphics format" ), + _( "Export SV&G" ), + _( "Export a board file in Scalable Vector Graphics format" ), KiBitmap( plot_svg_xpm ) ); // Plot diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index 3c3d7f0149..56b92514ef 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include diff --git a/pcbnew/plot_rtn.cpp b/pcbnew/plot_rtn.cpp index e0b4a495b7..9778aee412 100644 --- a/pcbnew/plot_rtn.cpp +++ b/pcbnew/plot_rtn.cpp @@ -34,18 +34,87 @@ static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, EDA_DRAW_MODE_T trace_mode, EDA_COLOR_T aColor ); +static bool PlotAllTextsModule( PLOTTER* aPlotter, BOARD* aBoard, + long aLayerMask, MODULE* aModule, + const PCB_PLOT_PARAMS& aPlotOpt ) +{ + TEXTE_MODULE* pt_texte; + EDA_DRAW_MODE_T trace_mode = aPlotOpt.GetMode(); + + // see if we want to plot VALUE and REF fields + bool trace_val = aPlotOpt.GetPlotValue(); + bool trace_ref = aPlotOpt.GetPlotReference(); + + TEXTE_MODULE* text = aModule->m_Reference; + unsigned textLayer = text->GetLayer(); + + if( textLayer >= 32 ) + return false; + + if( ( ( 1 << textLayer ) & aLayerMask ) == 0 ) + trace_ref = false; + + if( !text->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) + trace_ref = false; + + text = aModule->m_Value; + textLayer = text->GetLayer(); + + if( textLayer > 32 ) + return false; + + if( ( (1 << textLayer) & aLayerMask ) == 0 ) + trace_val = false; + + if( !text->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) + trace_val = false; + + // Plot text fields, if allowed + if( trace_ref ) + PlotTextModule( aPlotter, aModule->m_Reference, + trace_mode, aPlotOpt.GetReferenceColor() ); + + if( trace_val ) + PlotTextModule( aPlotter, aModule->m_Value, + trace_mode, aPlotOpt.GetValueColor() ); + + for( pt_texte = (TEXTE_MODULE*) aModule->m_Drawings.GetFirst(); + pt_texte != NULL; pt_texte = pt_texte->Next() ) + { + if( pt_texte->Type() != PCB_MODULE_TEXT_T ) + continue; + + if( !aPlotOpt.GetPlotOtherText() ) + continue; + + if( !pt_texte->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) + continue; + + textLayer = pt_texte->GetLayer(); + + if( textLayer >= 32 ) + return false; + + if( !( ( 1 << textLayer ) & aLayerMask ) ) + continue; + + EDA_COLOR_T color = aBoard->GetLayerColor( textLayer ); + PlotTextModule( aPlotter, pt_texte, trace_mode, color ); + } + + return true; +} + /* Creates the plot for silkscreen layers */ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, const PCB_PLOT_PARAMS& aPlotOpt ) { - TEXTE_MODULE* pt_texte; - EDA_DRAW_MODE_T trace_mode = aPlotOpt.GetMode(); // Plot edge layer and graphic items - for( EDA_ITEM* item = aBoard->m_Drawings; item; item = item->Next() ) + for( EDA_ITEM* item = aBoard->m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { @@ -91,11 +160,23 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, for( D_PAD * pad = Module->m_Pads; pad != NULL; pad = pad->Next() ) { // See if the pad is on this layer - if( (pad->GetLayerMask() & layersmask_plotpads) == 0 ) + int masklayer = pad->GetLayerMask(); + if( (masklayer & layersmask_plotpads) == 0 ) continue; wxPoint shape_pos = pad->ReturnShapePos(); + EDA_COLOR_T color = ColorFromInt(0); + if( (layersmask_plotpads & SILKSCREEN_LAYER_BACK) ) + color = aBoard->GetLayerColor( SILKSCREEN_N_BACK ); + + if((layersmask_plotpads & SILKSCREEN_LAYER_FRONT ) ) + color = ColorFromInt( color | aBoard->GetLayerColor( SILKSCREEN_N_FRONT ) ); + + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + switch( pad->GetShape() ) { case PAD_CIRCLE: @@ -129,91 +210,10 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, // Plot footprints fields (ref, value ...) for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) { - // see if we want to plot VALUE and REF fields - bool trace_val = aPlotOpt.GetPlotValue(); - bool trace_ref = aPlotOpt.GetPlotReference(); - - TEXTE_MODULE* text = module->m_Reference; - unsigned textLayer = text->GetLayer(); - - if( textLayer >= 32 ) + if( ! PlotAllTextsModule( aPlotter, aBoard, aLayerMask, module, aPlotOpt ) ) { - wxString errMsg; - - errMsg.Printf( _( "Your BOARD has a bad layer number of %u for \ -module\n %s's \"reference\" text." ), - textLayer, GetChars( module->GetReference() ) ); - DisplayError( NULL, errMsg ); - return; - } - - if( ( ( 1 << textLayer ) & aLayerMask ) == 0 ) - trace_ref = false; - - if( !text->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) - trace_ref = false; - - text = module->m_Value; - textLayer = text->GetLayer(); - - if( textLayer > 32 ) - { - wxString errMsg; - - errMsg.Printf( _( "Your BOARD has a bad layer number of %u for \ -module\n %s's \"value\" text." ), - textLayer, GetChars( module->GetReference() ) ); - DisplayError( NULL, errMsg ); - return; - } - - if( ( (1 << textLayer) & aLayerMask ) == 0 ) - trace_val = false; - - if( !text->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) - trace_val = false; - - // Plot text fields, if allowed - if( trace_ref ) - PlotTextModule( aPlotter, module->m_Reference, - trace_mode, aPlotOpt.GetReferenceColor() ); - - if( trace_val ) - PlotTextModule( aPlotter, module->m_Value, - trace_mode, aPlotOpt.GetValueColor() ); - - for( pt_texte = (TEXTE_MODULE*) module->m_Drawings.GetFirst(); - pt_texte != NULL; - pt_texte = pt_texte->Next() ) - { - if( pt_texte->Type() != PCB_MODULE_TEXT_T ) - continue; - - if( !aPlotOpt.GetPlotOtherText() ) - continue; - - if( !pt_texte->IsVisible() && !aPlotOpt.GetPlotInvisibleText() ) - continue; - - textLayer = pt_texte->GetLayer(); - - if( textLayer >= 32 ) - { - wxString errMsg; - - errMsg.Printf( _( "Your BOARD has a bad layer number of %u \ -for module\n %s's \"module text\" text of %s." ), - textLayer, GetChars( module->GetReference() ), - GetChars( pt_texte->m_Text ) ); - DisplayError( NULL, errMsg ); - return; - } - - if( !( ( 1 << textLayer ) & aLayerMask ) ) - continue; - - PlotTextModule( aPlotter, pt_texte, - trace_mode, aPlotOpt.GetColor() ); + wxLogMessage( _( "Your BOARD has a bad layer number for module %s" ), + GetChars( module->GetReference() ) ); } } @@ -247,6 +247,8 @@ static void PlotTextModule( PLOTTER* aPlotter, TEXTE_MODULE* pt_texte, wxPoint pos; int orient, thickness; + aPlotter->SetColor( aColor != WHITE ? aColor : LIGHTGRAY); + // calculate some text parameters : size = pt_texte->m_Size; pos = pt_texte->m_Pos; @@ -287,6 +289,11 @@ void PlotDimension( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, draw.SetWidth( (trace_mode==LINE) ? -1 : aDim->GetWidth() ); draw.SetLayer( aDim->GetLayer() ); + EDA_COLOR_T color = aDim->GetBoard()->GetLayerColor( aDim->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + PlotTextePcb( aPlotter, aPlotOpts, &aDim->m_Text, aLayerMask, trace_mode ); draw.SetStart( wxPoint( aDim->m_crossBarOx, aDim->m_crossBarOy )); @@ -328,14 +335,21 @@ void PlotPcbTarget( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, if( (GetLayerMask( aMire->GetLayer() ) & aLayerMask) == 0 ) return; + EDA_COLOR_T color = aMire->GetBoard()->GetLayerColor( aMire->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + DRAWSEGMENT draw; draw.SetShape( S_CIRCLE ); draw.SetWidth( ( trace_mode == LINE ) ? -1 : aMire->GetWidth() ); draw.SetLayer( aMire->GetLayer() ); - draw.SetStart( aMire->GetPosition() ); - draw.SetEnd( wxPoint( draw.GetStart().x + ( aMire->GetSize() / 4 ), draw.GetStart().y )); + radius = aMire->GetSize() / 3; + if( aMire->GetShape() ) // shape X + radius = aMire->GetSize() / 2; + draw.SetEnd( wxPoint( draw.GetStart().x + radius, draw.GetStart().y )); PlotDrawSegment( aPlotter, aPlotOpts, &draw, aLayerMask, trace_mode ); draw.SetShape( S_SEGMENT ); @@ -348,7 +362,7 @@ void PlotPcbTarget( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, if( aMire->GetShape() ) // Shape X { - dx1 = dy1 = ( radius * 7 ) / 5; + dx1 = dy1 = radius; dx2 = dx1; dy2 = -dy1; } @@ -400,6 +414,11 @@ void Plot_1_EdgeModule( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, if( aEdge->Type() != PCB_MODULE_EDGE_T ) return; + EDA_COLOR_T color = aEdge->GetBoard( )->GetLayerColor( aEdge->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + type_trace = aEdge->GetShape(); thickness = aEdge->GetWidth(); @@ -486,6 +505,11 @@ void PlotTextePcb( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, TEXTE_PC if( ( GetLayerMask( pt_texte->GetLayer() ) & aLayerMask ) == 0 ) return; + EDA_COLOR_T color = pt_texte->GetBoard( )->GetLayerColor( pt_texte->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + size = pt_texte->m_Size; pos = pt_texte->m_Pos; orient = pt_texte->m_Orient; @@ -543,6 +567,11 @@ void PlotFilledAreas( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, ZONE_ static std::vector< wxPoint > cornerList; cornerList.clear(); + EDA_COLOR_T color = aZone->GetBoard( )->GetLayerColor( aZone->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + /* Plot all filled areas: filled areas have a filled area and a thick * outline we must plot the filled area itself ( as a filled polygon * OR a set of segments ) and plot the thick outline itself @@ -622,6 +651,14 @@ void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, else thickness = aSeg->GetWidth(); + if( aSeg->GetBoard() ) // temporary created segments in plot functions return NULL + { + EDA_COLOR_T color = aSeg->GetBoard()->GetLayerColor( aSeg->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + } + wxPoint start( aSeg->GetStart() ); wxPoint end( aSeg->GetEnd() ); @@ -664,7 +701,7 @@ void PlotDrawSegment( PLOTTER* aPlotter, const PCB_PLOT_PARAMS& aPlotOpts, void PlotBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, int aLayer, const PCB_PLOT_PARAMS& aPlotOpt ) { - // Set the color and the text mode for this layer + // Set a default color and the text mode for this layer aPlotter->SetColor( aPlotOpt.GetColor() ); aPlotter->SetTextMode( aPlotOpt.GetTextMode() ); @@ -779,22 +816,36 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, break; default: - DisplayError( NULL, wxT( "Plot_Standard_Layer() error : Unexpected Draw Type" ) ); + wxLogMessage( wxT( "Plot_Standard_Layer() error : Unexpected Draw Type" ) ); break; } } // Draw footprint shapes without pads (pads will plotted later) + // We plot here module texts, but they are usually on silkscreen layer, + // so they are not plot here but plot by PlotSilkScreen() + // Plot footprints fields (ref, value ...) + for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) + { + if( ! PlotAllTextsModule( aPlotter, aBoard, aLayerMask, module, aPlotOpt ) ) + { + wxLogMessage( _( "Your BOARD has a bad layer number for module %s" ), + GetChars( module->GetReference() ) ); + } + } + for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) { for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() ) { + if( ! (aLayerMask & GetLayerMask( item->GetLayer() ) ) ) + continue; + switch( item->Type() ) { case PCB_MODULE_EDGE_T: - if( aLayerMask & GetLayerMask( item->GetLayer() ) ) - Plot_1_EdgeModule( aPlotter, aPlotOpt, (EDGE_MODULE*) item, aPlotMode, aLayerMask ); - + Plot_1_EdgeModule( aPlotter, aPlotOpt, (EDGE_MODULE*) item, + aPlotMode, aLayerMask ); break; default: @@ -848,6 +899,18 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, if( size.x <= 0 || size.y <= 0 ) continue; + EDA_COLOR_T color = ColorFromInt(0); + + if( (pad->GetLayerMask() & LAYER_BACK) ) + color = aBoard->GetVisibleElementColor( PAD_BK_VISIBLE ); + + if((pad->GetLayerMask() & LAYER_FRONT ) ) + color = ColorFromInt( color | aBoard->GetVisibleElementColor( PAD_FR_VISIBLE ) ); + + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + switch( pad->GetShape() ) { case PAD_CIRCLE: @@ -917,9 +980,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, via_margin = aBoard->GetDesignSettings().m_SolderMaskMargin; if( aLayerMask & ALL_CU_LAYERS ) - { width_adj = aPlotter->GetPlotWidthAdj(); - } pos = Via->m_Start; size.x = size.y = Via->m_Width + 2 * via_margin + width_adj; @@ -928,6 +989,11 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, if( size.x <= 0 ) continue; + EDA_COLOR_T color = aBoard->GetVisibleElementColor(VIAS_VISIBLE + Via->m_Shape); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + aPlotter->FlashPadCircle( pos, size.x, aPlotMode ); } } @@ -947,6 +1013,11 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, pos = track->m_Start; end = track->m_End; + EDA_COLOR_T color = aBoard->GetLayerColor( track->GetLayer() ); + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); + aPlotter->ThickSegment( pos, end, size.x, aPlotMode ); } @@ -1021,7 +1092,7 @@ void PlotDrillMarks( BOARD *aBoard, PLOTTER* aPlotter, /* 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) + - PS, SVG 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 @@ -1149,7 +1220,7 @@ static void PlotSetupPlotter( PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts, aPlotOpts->GetMirror() ); aPlotter->SetDefaultLineWidth( aPlotOpts->GetLineWidth() ); aPlotter->SetCreator( wxT( "PCBNEW" ) ); - aPlotter->SetColorMode( true ); + aPlotter->SetColorMode( false ); // default is plot in Black and White. aPlotter->SetFilename( aFilename ); aPlotter->SetTextMode( aPlotOpts->GetTextMode() ); } @@ -1158,7 +1229,7 @@ static void PlotSetupPlotter( PLOTTER *aPlotter, PCB_PLOT_PARAMS *aPlotOpts, * 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 + static const int margin = 5 * IU_PER_MM; // Add a 5 mm 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 ), @@ -1200,8 +1271,7 @@ static void ConfigureHPGLPenSizes( HPGL_PLOTTER *aPlotter, * 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, +PLOTTER *StartPlotBoard( BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts, const wxString& aFullFileName, const wxString& aSheetDesc ) { @@ -1266,7 +1336,7 @@ PLOTTER *StartPlotBoard( BOARD *aBoard, { /* 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 + * color to WHITE; note the color inversion is actually done * in the driver (if supported) */ if( aPlotOpts->GetNegative() ) FillNegativeKnockout( the_plotter, bbbox );