///////////////////////////////////////////////////////////////////////////// // Name: svg_print.cpp // Purpose: // Author: jean-pierre Charras // Modified by: // Created: 05/02/2006 11:05:19 // RCS-ID: // Copyright: License GNU // Licence: ///////////////////////////////////////////////////////////////////////////// // Generated by DialogBlocks (unregistered), 05/02/2006 11:05:19 #if defined (__GNUG__) && !defined (NO_GCC_PRAGMA) #pragma implementation "svg_print.h" #endif // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif ////@begin includes ////@end includes #include #include "wx/metafile.h" #include "wx/image.h" #include "fctsys.h" #include "gr_basic.h" #include "common.h" #include "dcsvg.h" #include "svg_print.h" #ifdef EESCHEMA #include "program.h" #endif ////@begin XPM images ////@end XPM images extern BASE_SCREEN* ActiveScreen; #ifdef EESCHEMA #define WIDTH_MAX_VALUE 100 #else #define WIDTH_MAX_VALUE 1000 #endif #define WIDTH_MIN_VALUE 1 // Variables locales static int s_SVGPenMinWidth; /* Minimum pen width (in internal units) for printing */ static int Select_PrintAll = FALSE; static bool Print_Sheet_Ref = TRUE; static int s_PlotBlackAndWhite = 0; /*******************************************************/ void WinEDA_DrawFrame::SVG_Print( wxCommandEvent& event ) /*******************************************************/ /* Prepare les structures de donnees de gestion de l'impression * et affiche la fenetre de dialogue de gestion de l'impression des feuilles */ { // Arret des commandes en cours if( DrawPanel->ManageCurseur && DrawPanel->ForceCloseManageCurseur ) { wxClientDC dc( DrawPanel ); DrawPanel->PrepareDC( dc ); DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc ); } SetToolID( 0, wxCURSOR_ARROW, wxEmptyString ); WinEDA_PrintSVGFrame frame( this ); frame.ShowModal(); } /*! * WinEDA_PrintSVGFrame type definition */ IMPLEMENT_DYNAMIC_CLASS( WinEDA_PrintSVGFrame, wxDialog ) /*! * WinEDA_PrintSVGFrame event table definition */ BEGIN_EVENT_TABLE( WinEDA_PrintSVGFrame, wxDialog ) ////@begin WinEDA_PrintSVGFrame event table entries EVT_CLOSE( WinEDA_PrintSVGFrame::OnCloseWindow ) EVT_RADIOBOX( ID_RADIOBOX_SETPRINTMODE, WinEDA_PrintSVGFrame::OnRadioboxSetprintmodeSelected ) EVT_BUTTON( ID_PRINT_EXECUTE, WinEDA_PrintSVGFrame::OnPrintExecuteClick ) EVT_BUTTON( wxID_CLOSE, WinEDA_PrintSVGFrame::OnCloseClick ) ////@end WinEDA_PrintSVGFrame event table entries END_EVENT_TABLE() /*! * WinEDA_PrintSVGFrame constructors */ WinEDA_PrintSVGFrame::WinEDA_PrintSVGFrame() { } WinEDA_PrintSVGFrame::WinEDA_PrintSVGFrame( WinEDA_DrawFrame* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { m_Parent = parent; m_ImageXSize_mm = 270; wxConfig* Config = m_Parent->m_Parent->m_EDA_Config; if( Config ) { Config->Read( wxT( "PlotSVGPenWidth" ), &s_SVGPenMinWidth ); Config->Read( wxT( "PlotSVGModeColor" ), &s_PlotBlackAndWhite ); } Create( parent, id, caption, pos, size, style ); } /*! * WinEDA_PrintSVGFrame creator */ bool WinEDA_PrintSVGFrame::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { ////@begin WinEDA_PrintSVGFrame member initialisation m_DialogPenWidthSizer = NULL; m_ModeColorOption = NULL; m_Print_Sheet_Ref = NULL; m_PagesOption = NULL; m_FileNameCtrl = NULL; m_MessagesBox = NULL; ////@end WinEDA_PrintSVGFrame member initialisation ////@begin WinEDA_PrintSVGFrame creation SetExtraStyle( GetExtraStyle() | wxWS_EX_BLOCK_EVENTS ); wxDialog::Create( parent, id, caption, pos, size, style ); CreateControls(); if( GetSizer() ) { GetSizer()->SetSizeHints( this ); } Centre(); ////@end WinEDA_PrintSVGFrame creation return true; } /*! * Control creation for WinEDA_PrintSVGFrame */ void WinEDA_PrintSVGFrame::CreateControls() { SetFont( *g_DialogFont ); ////@begin WinEDA_PrintSVGFrame content construction // Generated by DialogBlocks, 24/01/2007 19:00:23 (unregistered) WinEDA_PrintSVGFrame* itemDialog1 = this; wxBoxSizer* itemBoxSizer2 = new wxBoxSizer( wxVERTICAL ); itemDialog1->SetSizer( itemBoxSizer2 ); wxBoxSizer* itemBoxSizer3 = new wxBoxSizer( wxHORIZONTAL ); itemBoxSizer2->Add( itemBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5 ); wxBoxSizer* itemBoxSizer4 = new wxBoxSizer( wxVERTICAL ); itemBoxSizer3->Add( itemBoxSizer4, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); m_DialogPenWidthSizer = new wxBoxSizer( wxVERTICAL ); itemBoxSizer4->Add( m_DialogPenWidthSizer, 0, wxGROW | wxALL, 5 ); wxString m_ModeColorOptionStrings[] = { _( "Color" ), _( "Black and White" ) }; m_ModeColorOption = new wxRadioBox( itemDialog1, ID_RADIOBOX_SETPRINTMODE, _( "Print mode" ), wxDefaultPosition, wxDefaultSize, 2, m_ModeColorOptionStrings, 1, wxRA_SPECIFY_COLS ); m_ModeColorOption->SetSelection( 0 ); itemBoxSizer4->Add( m_ModeColorOption, 0, wxALIGN_LEFT | wxALL, 5 ); m_Print_Sheet_Ref = new wxCheckBox( itemDialog1, ID_CHECKBOX, _( "Print Sheet Ref" ), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_Print_Sheet_Ref->SetValue( false ); itemBoxSizer4->Add( m_Print_Sheet_Ref, 0, wxALIGN_LEFT | wxALL, 5 ); itemBoxSizer3->Add( 5, 5, 0, wxALIGN_CENTER_VERTICAL | wxALL, 15 ); wxBoxSizer* itemBoxSizer9 = new wxBoxSizer( wxVERTICAL ); itemBoxSizer3->Add( itemBoxSizer9, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); wxString m_PagesOptionStrings[] = { _( "Current" ), _( "All" ) }; m_PagesOption = new wxRadioBox( itemDialog1, ID_RADIOBOX1, _( "Page Print:" ), wxDefaultPosition, wxDefaultSize, 2, m_PagesOptionStrings, 1, wxRA_SPECIFY_COLS ); m_PagesOption->SetSelection( 0 ); itemBoxSizer9->Add( m_PagesOption, 0, wxALIGN_LEFT | wxALL, 5 ); wxButton* itemButton11 = new wxButton( itemDialog1, ID_PRINT_EXECUTE, _( "Create &File" ), wxDefaultPosition, wxDefaultSize, 0 ); itemButton11->SetDefault(); itemButton11->SetForegroundColour( wxColour( 0, 128, 0 ) ); itemBoxSizer9->Add( itemButton11, 0, wxGROW | wxALL, 5 ); wxButton* itemButton12 = new wxButton( itemDialog1, wxID_CLOSE, _( "&Close" ), wxDefaultPosition, wxDefaultSize, 0 ); itemButton12->SetForegroundColour( wxColour( 0, 0, 198 ) ); itemBoxSizer9->Add( itemButton12, 0, wxGROW | wxALL, 5 ); wxStaticText* itemStaticText13 = new wxStaticText( itemDialog1, wxID_STATIC, _( "Filename:" ), wxDefaultPosition, wxDefaultSize, 0 ); itemBoxSizer2->Add( itemStaticText13, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE, 5 ); m_FileNameCtrl = new wxTextCtrl( itemDialog1, ID_TEXTCTRL, _T( "" ), wxDefaultPosition, wxDefaultSize, 0 ); itemBoxSizer2->Add( m_FileNameCtrl, 0, wxGROW | wxALL, 5 ); wxStaticText* itemStaticText15 = new wxStaticText( itemDialog1, wxID_STATIC, _( "Messages:" ), wxDefaultPosition, wxDefaultSize, 0 ); itemBoxSizer2->Add( itemStaticText15, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE, 5 ); m_MessagesBox = new wxTextCtrl( itemDialog1, ID_TEXTCTRL1, _T( "" ), wxDefaultPosition, wxSize( -1, 100 ), wxTE_MULTILINE | wxTE_READONLY ); itemBoxSizer2->Add( m_MessagesBox, 0, wxGROW | wxALL, 5 ); // Set validators m_ModeColorOption->SetValidator( wxGenericValidator( &s_PlotBlackAndWhite ) ); m_Print_Sheet_Ref->SetValidator( wxGenericValidator( &Print_Sheet_Ref ) ); ////@end WinEDA_PrintSVGFrame content construction m_DialogPenWidth = new WinEDA_ValueCtrl( this, _( "Pen width mini" ), s_SVGPenMinWidth, g_UnitMetric, m_DialogPenWidthSizer, m_Parent->m_InternalUnits ); } /*! * Should we show tooltips? */ bool WinEDA_PrintSVGFrame::ShowToolTips() { return true; } /*! * Get bitmap resources */ wxBitmap WinEDA_PrintSVGFrame::GetBitmapResource( const wxString& name ) { // Bitmap retrieval ////@begin WinEDA_PrintSVGFrame bitmap retrieval wxUnusedVar( name ); return wxNullBitmap; ////@end WinEDA_PrintSVGFrame bitmap retrieval } /*! * Get icon resources */ wxIcon WinEDA_PrintSVGFrame::GetIconResource( const wxString& name ) { // Icon retrieval ////@begin WinEDA_PrintSVGFrame icon retrieval wxUnusedVar( name ); return wxNullIcon; ////@end WinEDA_PrintSVGFrame icon retrieval } /******************************************************/ wxString WinEDA_PrintSVGFrame::ReturnFullFileName() /******************************************************/ { wxString name, ext; name = m_Parent->GetScreen()->m_FileName; ChangeFileNameExt( name, wxT( ".svg" ) ); return name; } /********************************************/ void WinEDA_PrintSVGFrame::SetPenWidth() /********************************************/ { s_SVGPenMinWidth = m_DialogPenWidth->GetValue(); if( s_SVGPenMinWidth > WIDTH_MAX_VALUE ) { s_SVGPenMinWidth = WIDTH_MAX_VALUE; } if( s_SVGPenMinWidth < WIDTH_MIN_VALUE ) { s_SVGPenMinWidth = WIDTH_MIN_VALUE; } m_DialogPenWidth->SetValue( s_SVGPenMinWidth ); } /**************************************************************/ void WinEDA_PrintSVGFrame::PrintSVGDoc( wxCommandEvent& event ) /**************************************************************/ /* Called on activate "Print CURRENT" button */ { bool print_ref = TRUE; wxString msg; Select_PrintAll = FALSE; if( m_PagesOption && (m_PagesOption->GetSelection() == 1) ) Select_PrintAll = TRUE; if( (m_Print_Sheet_Ref == NULL) || (m_Print_Sheet_Ref->GetValue() == FALSE) ) print_ref = FALSE; SetPenWidth(); BASE_SCREEN* screen = m_Parent->GetScreen(); BASE_SCREEN* oldscreen = screen; #ifndef EESCHEMA if( Select_PrintAll ) while( screen->Pback ) screen = (BASE_SCREEN*) screen->Pback; #endif if( (m_Parent->m_Ident == PCB_FRAME) || (m_Parent->m_Ident == GERBER_FRAME) ) { if( Select_PrintAll ) { m_PrintMaskLayer = 0xFFFFFFFF; } else m_PrintMaskLayer = 1; } if( screen == NULL ) return; #ifdef EESCHEMA if( Select_PrintAll && m_Parent->m_Ident == SCHEMATIC_FRAME ) { EDA_ScreenList ScreenList; for( SCH_SCREEN* schscreen = ScreenList.GetFirst(); schscreen != NULL; schscreen = ScreenList.GetNext() ) { /* Create all files *.svg */ ( (WinEDA_SchematicFrame*) m_Parent )->SetScreen( schscreen ); wxString FullFileName = schscreen->m_FileName; ChangeFileNameExt( FullFileName, wxT( ".svg" ) ); bool success = DrawPage( FullFileName, schscreen ); msg = _( "Create file " ) + FullFileName; if( !success ) msg += _( " error" ); msg += wxT( "\n" ); m_MessagesBox->AppendText( msg ); } } else #endif { wxString FullFileName = m_FileNameCtrl->GetValue(); if( FullFileName.IsEmpty() ) { FullFileName = screen->m_FileName; ChangeFileNameExt( FullFileName, wxT( ".svg" ) ); } bool success = DrawPage( FullFileName, screen ); msg = _( "Create file " ) + FullFileName; if( !success ) msg += _( " error" ); msg += wxT( "\n" ); m_MessagesBox->AppendText( msg ); } ActiveScreen = oldscreen; } /*****************************************************************/ bool WinEDA_PrintSVGFrame::DrawPage( const wxString& FullFileName, BASE_SCREEN* screen ) /*****************************************************************/ /* * Routine effective d'impression */ { int tmpzoom; wxPoint tmp_startvisu; wxSize SheetSize; // Sheet size in internal units wxPoint old_org; float dpi; bool success = TRUE; /* modification des cadrages et reglages locaux */ tmp_startvisu = screen->m_StartVisu; tmpzoom = screen->GetZoom(); old_org = screen->m_DrawOrg; screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0; screen->m_StartVisu.x = screen->m_StartVisu.y = 0; SheetSize = screen->m_CurrentSheetDesc->m_Size; // size in 1/1000 inch SheetSize.x *= m_Parent->m_InternalUnits / 1000; SheetSize.y *= m_Parent->m_InternalUnits / 1000; // size in pixels screen->SetZoom( 1 ); dpi = (float) SheetSize.x * 25.4 / m_ImageXSize_mm; WinEDA_DrawPanel* panel = m_Parent->DrawPanel; wxSVGFileDC dc( FullFileName, SheetSize.x, SheetSize.y, dpi ); if( !dc.Ok() ) { DisplayError( this, wxT( "SVGprint error: wxSVGFileDC not OK" ) ); success = FALSE; } else { EDA_Rect tmp = panel->m_ClipBox; GRResetPenAndBrush( &dc ); s_SVGPenMinWidth = m_DialogPenWidth->GetValue(); SetPenMinWidth( s_SVGPenMinWidth ); GRForceBlackPen( m_ModeColorOption->GetSelection() == 0 ? FALSE : TRUE ); panel->m_ClipBox.SetX( 0 ); panel->m_ClipBox.SetY( 0 ); panel->m_ClipBox.SetWidth( 0x7FFFFF0 ); panel->m_ClipBox.SetHeight( 0x7FFFFF0 ); g_IsPrinting = TRUE; setlocale( LC_NUMERIC, "C" ); // Switch the locale to standard C (needed to print floating point numbers like 1.3) panel->PrintPage( &dc, m_Print_Sheet_Ref, m_PrintMaskLayer ); setlocale( LC_NUMERIC, "" ); // revert to the current locale g_IsPrinting = FALSE; panel->m_ClipBox = tmp; } GRForceBlackPen( FALSE ); SetPenMinWidth( 1 ); screen->m_StartVisu = tmp_startvisu; screen->m_DrawOrg = old_org; screen->SetZoom( tmpzoom ); return success; } /*! * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_PRINT_EXECUTE */ void WinEDA_PrintSVGFrame::OnPrintExecuteClick( wxCommandEvent& event ) { PrintSVGDoc( event ); } /*! * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CLOSE */ void WinEDA_PrintSVGFrame::OnCloseClick( wxCommandEvent& event ) { Close( TRUE ); } /*! * wxEVT_CLOSE_WINDOW event handler for ID_DIALOG */ void WinEDA_PrintSVGFrame::OnCloseWindow( wxCloseEvent& event ) { wxConfig* Config = m_Parent->m_Parent->m_EDA_Config; if( Config ) { s_PlotBlackAndWhite = m_ModeColorOption->GetSelection(); Config->Write( wxT( "PlotSVGPenWidth" ), s_SVGPenMinWidth ); Config->Write( wxT( "PlotSVGModeColor" ), s_PlotBlackAndWhite ); } event.Skip(); } /*! * wxEVT_COMMAND_RADIOBOX_SELECTED event handler for ID_RADIOBOX_SETPRINTMODE */ void WinEDA_PrintSVGFrame::OnRadioboxSetprintmodeSelected( wxCommandEvent& event ) { s_PlotBlackAndWhite = m_ModeColorOption->GetSelection(); event.Skip(); }