// Actual SVG file export function. bool DIALOG_SVG_PRINT::CreateSVGFile( const wxString& aFullFileName ) { PCB_PLOT_PARAMS m_plotOpts; m_plotOpts.SetPlotFrameRef( PrintPageRef() ); // Adding drill marks, for copper layers if( (m_printMaskLayer & ALL_CU_LAYERS) ) m_plotOpts.SetDrillMarksType( PCB_PLOT_PARAMS::FULL_DRILL_SHAPE ); else m_plotOpts.SetDrillMarksType( PCB_PLOT_PARAMS::NO_DRILL_SHAPE ); m_plotOpts.SetSkipPlotNPTH_Pads( false ); m_plotOpts.SetMirror( m_printMirror ); m_plotOpts.SetFormat( PLOT_FORMAT_SVG ); EDA_COLOR_T color = UNSPECIFIED_COLOR; // Used layer color to plot ref and value m_plotOpts.SetReferenceColor( color ); m_plotOpts.SetValueColor( color ); PAGE_INFO pageInfo = m_board->GetPageSettings(); wxPoint axisorigin = m_board->GetAuxOrigin(); if( PageIsBoardBoundarySize() ) { EDA_RECT bbox = m_board->ComputeBoundingBox(); PAGE_INFO currpageInfo = m_board->GetPageSettings(); currpageInfo.SetWidthMils( bbox.GetWidth() / IU_PER_MILS ); currpageInfo.SetHeightMils( bbox.GetHeight() / IU_PER_MILS ); m_board->SetPageSettings( currpageInfo ); m_plotOpts.SetUseAuxOrigin( true ); wxPoint origin = bbox.GetOrigin(); m_board->SetAuxOrigin( origin ); } LOCALE_IO toggle; SVG_PLOTTER* plotter = (SVG_PLOTTER*) StartPlotBoard( m_board, &m_plotOpts, aFullFileName, wxEmptyString ); if( plotter ) { plotter->SetColorMode( m_ModeColorOption->GetSelection() == 0 ); PlotStandardLayer( m_board, plotter, m_printMaskLayer, m_plotOpts ); plotter->EndPlot(); } delete plotter; m_board->SetAuxOrigin( axisorigin ); m_board->SetPageSettings( pageInfo ); return true; }
void DIALOG_PAGES_SETTINGS::UpdatePageLayoutExample() { int lyWidth, lyHeight; wxSize clamped_layout_size( Clamp( MIN_PAGE_SIZE, m_layout_size.x, m_maxPageSizeMils.x ), Clamp( MIN_PAGE_SIZE, m_layout_size.y, m_maxPageSizeMils.y ) ); double lyRatio = clamped_layout_size.x < clamped_layout_size.y ? (double) clamped_layout_size.y / clamped_layout_size.x : (double) clamped_layout_size.x / clamped_layout_size.y; if( clamped_layout_size.x < clamped_layout_size.y ) { lyHeight = MAX_PAGE_EXAMPLE_SIZE; lyWidth = KiROUND( (double) lyHeight / lyRatio ); } else { lyWidth = MAX_PAGE_EXAMPLE_SIZE; lyHeight = KiROUND( (double) lyWidth / lyRatio ); } if( m_page_bitmap ) { m_PageLayoutExampleBitmap->SetBitmap( wxNullBitmap ); delete m_page_bitmap; } m_page_bitmap = new wxBitmap( lyWidth + 1, lyHeight + 1 ); if( m_page_bitmap->IsOk() ) { double scaleW = (double) lyWidth / clamped_layout_size.x; double scaleH = (double) lyHeight / clamped_layout_size.y; // Prepare DC. wxSize example_size( lyWidth + 1, lyHeight + 1 ); wxMemoryDC memDC; memDC.SelectObject( *m_page_bitmap ); memDC.SetClippingRegion( wxPoint( 0, 0 ), example_size ); memDC.Clear(); memDC.SetUserScale( scaleW, scaleH ); // Get logical page size and margins. PAGE_INFO pageDUMMY; // Get page type int idx = m_paperSizeComboBox->GetSelection(); if( idx < 0 ) idx = 0; wxString pageFmtName = m_pageFmt[idx].BeforeFirst( ' ' ); bool portrait = clamped_layout_size.x < clamped_layout_size.y; pageDUMMY.SetType( pageFmtName, portrait ); if( m_customFmt ) { pageDUMMY.SetWidthMils( clamped_layout_size.x ); pageDUMMY.SetHeightMils( clamped_layout_size.y ); } // Draw layout preview. wxString emptyString; GRResetPenAndBrush( &memDC ); WORKSHEET_LAYOUT::SetAltInstance( m_pagelayout ); GRFilledRect( NULL, &memDC, 0, 0, m_layout_size.x, m_layout_size.y, WHITE, WHITE ); DrawPageLayout( &memDC, NULL, pageDUMMY, emptyString, emptyString, m_tb, m_screen->m_NumberOfScreens, m_screen->m_ScreenNumber, 1, 1, DARKGRAY, RED ); memDC.SelectObject( wxNullBitmap ); m_PageLayoutExampleBitmap->SetBitmap( *m_page_bitmap ); WORKSHEET_LAYOUT::SetAltInstance( NULL ); // Refresh the dialog. Layout(); Refresh(); } }
void LIB_EDIT_FRAME::OnPlotCurrentComponent( wxCommandEvent& event ) { wxString fullFileName; wxString file_ext; wxString mask; LIB_PART* part = GetCurPart(); if( !part ) { wxMessageBox( _( "No component" ) ); return; } switch( event.GetId() ) { case ID_LIBEDIT_GEN_PNG_FILE: { bool fmt_is_jpeg = false; // could be selectable later. so keep this option. file_ext = fmt_is_jpeg ? wxT( "jpg" ) : wxT( "png" ); mask = wxT( "*." ) + file_ext; wxFileName fn( part->GetName() ); fn.SetExt( file_ext ); wxString pro_dir = wxPathOnly( Prj().GetProjectFullName() ); fullFileName = EDA_FILE_SELECTOR( _( "Filename:" ), pro_dir, fn.GetFullName(), file_ext, mask, this, wxFD_SAVE, true ); if( fullFileName.IsEmpty() ) return; // calling wxYield is mandatory under Linux, after closing the file selector dialog // to refresh the screen before creating the PNG or JPEG image from screen wxYield(); CreatePNGorJPEGFile( fullFileName, fmt_is_jpeg ); } break; case ID_LIBEDIT_GEN_SVG_FILE: { file_ext = wxT( "svg" ); mask = wxT( "*." ) + file_ext; wxFileName fn( part->GetName() ); fn.SetExt( file_ext ); wxString pro_dir = wxPathOnly( Prj().GetProjectFullName() ); fullFileName = EDA_FILE_SELECTOR( _( "Filename:" ), pro_dir, fn.GetFullName(), file_ext, mask, this, wxFD_SAVE, true ); if( fullFileName.IsEmpty() ) return; PAGE_INFO pageSave = GetScreen()->GetPageSettings(); PAGE_INFO pageTemp = pageSave; wxSize componentSize = part->GetUnitBoundingBox( m_unit, m_convert ).GetSize(); // Add a small margin to the plot bounding box pageTemp.SetWidthMils( int( componentSize.x * 1.2 ) ); pageTemp.SetHeightMils( int( componentSize.y * 1.2 ) ); GetScreen()->SetPageSettings( pageTemp ); SVG_PlotComponent( fullFileName ); GetScreen()->SetPageSettings( pageSave ); } break; } }