/** @file plot_schematic_PDF.cpp */ /* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 1992-2010 Jean-Pierre Charras #include #include #include #include #include #include #include void DIALOG_PLOT_SCHEMATIC::createPDFFile() { SCH_SCREEN* screen = m_parent->GetScreen(); SCH_SHEET_PATH* sheetpath; SCH_SHEET_PATH oldsheetpath = m_parent->GetCurrentSheet(); // sheetpath is saved here wxPoint plot_offset; /* When printing all pages, the printed page is not the current page. In * complex hierarchies, we must update component references and others * parameters in the given printed SCH_SCREEN, accordint to the sheet path * because in complex hierarchies a SCH_SCREEN (a drawing ) is shared * between many sheets and component references depend on the actual sheet * path used */ SCH_SHEET_LIST SheetList( NULL ); sheetpath = SheetList.GetFirst(); // Allocate the plotter and set the job level parameter PDF_PLOTTER* plotter = new PDF_PLOTTER(); plotter->SetDefaultLineWidth( g_DrawDefaultLineThickness ); plotter->SetColorMode( getModeColor() ); plotter->SetCreator( wxT( "Eeschema-PDF" ) ); // First page handling is different bool first_page = true; do { // Step over the schematic hierarchy if( m_select_PlotAll ) { SCH_SHEET_PATH list; if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) { m_parent->SetCurrentSheet( list ); m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); screen = m_parent->GetCurrentSheet().LastScreen(); } else // Should not happen wxASSERT( 0 ); sheetpath = SheetList.GetNext(); } if( first_page ) { wxString msg; wxString plotFileName = m_parent->GetUniqueFilenameForCurrentSheet() + wxT( "." ) + PDF_PLOTTER::GetDefaultFileExtension(); msg.Printf( _( "Plot: %s " ), GetChars( plotFileName ) ); m_MessagesBox->AppendText( msg ); FILE* output_file = wxFopen( plotFileName, wxT( "wb" ) ); if( output_file == NULL ) { msg = wxT( "\n** " ); msg += _( "Unable to create " ) + plotFileName + wxT( " **\n" ); m_MessagesBox->AppendText( msg ); wxBell(); return; } // Open the plotter and do the first page SetLocaleTo_C_standard(); plotter->SetFilename( plotFileName ); setupPlotPage( plotter, screen ); plotter->StartPlot( output_file ); first_page = false; } else { /* For the following pages you need to close the (finished) page, * reconfigure, and then start a new one */ plotter->ClosePage(); setupPlotPage( plotter, screen ); plotter->StartPage(); } plotOneSheetPDF( plotter, screen ); } while( m_select_PlotAll && sheetpath ); // Everything done, close the plot and restore the environment plotter->EndPlot(); delete plotter; SetLocaleTo_Default(); // Restore the previous sheet m_parent->SetCurrentSheet( oldsheetpath ); m_parent->GetCurrentSheet().UpdateAllScreenReferences(); m_parent->SetSheetNumberAndCount(); } void DIALOG_PLOT_SCHEMATIC::plotOneSheetPDF( PLOTTER* plotter, SCH_SCREEN* screen ) { if( getPlotFrameRef() ) { 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 ); }