// Open and display a previewer frame for printing void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) { if( !PreparePrintPrms() ) return; // Pass two printout objects: for preview, and possible printing. wxString title = _( "Print Preview" ); wxPrintPreview* preview = new wxPrintPreview( new BOARD_PRINTOUT_CONTROLLER( s_Parameters, m_Parent, title ), new BOARD_PRINTOUT_CONTROLLER( s_Parameters, m_Parent, title ), s_printData ); if( preview == NULL ) { DisplayError( this, wxT( "OnPrintPreview() problem" ) ); return; } // Uses the parent position and size. // @todo uses last position and size ans store them when exit in m_Config wxPoint WPos = m_Parent->GetPosition(); wxSize WSize = m_Parent->GetSize(); wxPreviewFrame* frame = new wxPreviewFrame( preview, this, title, WPos, WSize ); frame->SetMinSize( wxSize( 550, 350 ) ); frame->Initialize(); frame->Raise(); // Needed on Ubuntu/Unity to display the frame frame->Show( true ); }
/* MacOSX: Needed for file association * http://wiki.wxwidgets.org/WxMac-specific_topics */ void EDA_APP::MacOpenFile( const wxString& aFileName ) { wxFileName filename = aFileName; GERBVIEW_FRAME * frame = ((GERBVIEW_FRAME*)GetTopWindow()); if( !filename.FileExists() ) return; frame->LoadGerberFiles( aFileName ); }
bool GBR_TO_PCB_EXPORTER::ExportPcb( LAYER_NUM* LayerLookUpTable, int aCopperLayers ) { m_fp = wxFopen( m_pcb_file_name, wxT( "wt" ) ); if( m_fp == NULL ) { wxString msg; msg.Printf( _( "Cannot create file <%s>" ), GetChars( m_pcb_file_name ) ); DisplayError( m_gerbview_frame, msg ); return false; } m_pcbCopperLayersCount = aCopperLayers; writePcbHeader(); // create an image of gerber data // First: non copper layers: GERBER_DRAW_ITEM* gerb_item = m_gerbview_frame->GetItemsList(); for( ; gerb_item; gerb_item = gerb_item->Next() ) { LAYER_NUM layer = gerb_item->GetLayer(); LAYER_NUM pcb_layer_number = LayerLookUpTable[layer]; if( !IsPcbLayer( pcb_layer_number ) ) continue; if( pcb_layer_number > LAST_COPPER_LAYER ) export_non_copper_item( gerb_item, pcb_layer_number ); } // Copper layers fprintf( m_fp, "$TRACK\n" ); gerb_item = m_gerbview_frame->GetItemsList(); for( ; gerb_item; gerb_item = gerb_item->Next() ) { LAYER_NUM layer = gerb_item->GetLayer(); LAYER_NUM pcb_layer_number = LayerLookUpTable[layer]; if( pcb_layer_number < 0 || pcb_layer_number > LAST_COPPER_LAYER ) continue; else export_copper_item( gerb_item, pcb_layer_number ); } fprintf( m_fp, "$EndTRACK\n" ); fprintf( m_fp, "$EndBOARD\n" ); fclose( m_fp ); m_fp = NULL; return true; }
void GERBVIEW_DRAW_PANEL_GAL::OnShow() { GERBVIEW_FRAME* frame = dynamic_cast<GERBVIEW_FRAME*>( GetParent() ); if( frame ) { SetTopLayer( frame->GetActiveLayer() ); GBR_DISPLAY_OPTIONS* displ_opts = (GBR_DISPLAY_OPTIONS*) frame->GetDisplayOptions(); static_cast<KIGFX::GERBVIEW_RENDER_SETTINGS*>( m_view->GetPainter()->GetSettings() )->LoadDisplayOptions( displ_opts ); } m_view->RecacheAllItems(); }
void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) /************************************************************/ /* Open and display a previewer frame for printing */ { SetPrintParameters( ); // Pass two printout objects: for preview, and possible printing. wxString title = _( "Print Preview" ); wxPrintPreview* preview = new wxPrintPreview( new BOARD_PRINTOUT_CONTROLLER( s_Parameters, m_Parent, title ), new BOARD_PRINTOUT_CONTROLLER( s_Parameters, m_Parent, title ), g_PrintData ); if( preview == NULL ) { DisplayError( this, wxT( "OnPrintPreview() problem" ) ); return; } SetLayerMaskFromListSelection(); // If no layer selected, we have no plot. prompt user if it happens // because he could think there is a bug in Pcbnew: if( s_Parameters.m_PrintMaskLayer == 0 ) { DisplayError( this, _( "No layer selected" ) ); return; } // Uses the parent position and size. // @todo uses last position and size ans store them when exit in m_Config wxPoint WPos = m_Parent->GetPosition(); wxSize WSize = m_Parent->GetSize(); wxPreviewFrame* frame = new wxPreviewFrame( preview, this, title, WPos, WSize ); frame->Initialize(); frame->Show( true ); }
bool DIALOG_PRINT_USING_PRINTER::PreparePrintPrms() { SetPrintParameters(); // If no layer selected, we have no plot. prompt user if it happens // because he could think there is a bug in Pcbnew: if( m_Parent->GetGerberLayout()->GetPrintableLayers().size() == 0 ) { DisplayError( this, _( "No layer selected" ) ); return false; } return true; }
int DIALOG_PRINT_USING_PRINTER::SetLayerSetFromListSelection() { std::vector<int> layerList; for( int ii = 0; ii < GERBER_DRAWLAYERS_COUNT; ++ii ) { if( m_BoxSelectLayer[ii]->IsChecked() && m_BoxSelectLayer[ii]->IsEnabled() ) layerList.push_back( ii ); } m_Parent->GetGerberLayout()->SetPrintableLayers( layerList ); s_Parameters.m_PageCount = layerList.size(); return s_Parameters.m_PageCount; }
void DIALOG_DISPLAY_OPTIONS::OnOKBUttonClick( wxCommandEvent& event ) { m_Parent->m_DisplayOptions.m_DisplayPolarCood = (m_PolarDisplay->GetSelection() == 0) ? false : true; g_UserUnit = (m_BoxUnits->GetSelection() == 0) ? INCHES : MILLIMETRES; m_Parent->SetCursorShape( m_CursorShape->GetSelection() ); if( m_OptDisplayLines->GetSelection() == 1 ) m_Parent->m_DisplayOptions.m_DisplayLinesFill = true; else m_Parent->m_DisplayOptions.m_DisplayLinesFill = false; if( m_OptDisplayFlashedItems->GetSelection() == 1 ) { m_Parent->m_DisplayOptions.m_DisplayFlashedItemsFill = true; } else { m_Parent->m_DisplayOptions.m_DisplayFlashedItemsFill = false; } if( m_OptDisplayPolygons->GetSelection() == 0 ) m_Parent->m_DisplayOptions.m_DisplayPolygonsFill = false; else m_Parent->m_DisplayOptions.m_DisplayPolygonsFill = true; m_Parent->SetElementVisibility( DCODES_VISIBLE, m_OptDisplayDCodes->GetValue() ); int idx = m_ShowPageLimits->GetSelection(); m_Parent->SetShowBorderAndTitleBlock( idx > 0 ? true : false ); PAGE_INFO pageInfo( g_GerberPageSizeList[idx] ); m_Parent->SetPageSettings( pageInfo ); m_Parent->GetCanvas()->SetEnableZoomNoCenter( m_OptZoomNoCenter->GetValue() ); m_Parent->GetCanvas()->SetEnableMiddleButtonPan( m_OptMiddleButtonPan->GetValue() ); m_Parent->GetCanvas()->SetMiddleButtonPanLimited( m_OptMiddleButtonPanLimited->GetValue() ); m_Parent->GetCanvas()->Refresh(); EndModal( 1 ); }
void DIALOG_DISPLAY_OPTIONS::initOptDialog( ) { m_PolarDisplay->SetSelection( m_Parent->m_DisplayOptions.m_DisplayPolarCood ? 1 : 0 ); m_BoxUnits->SetSelection( g_UserUnit ? 1 : 0 ); m_CursorShape->SetSelection( m_Parent->GetCursorShape() ? 1 : 0 ); // Show Option Draw Lines. We use DisplayPcbTrackFill as Lines draw option m_OptDisplayLines->SetSelection( m_Parent->m_DisplayOptions.m_DisplayLinesFill ? 1 : 0 ); m_OptDisplayFlashedItems->SetSelection( m_Parent->m_DisplayOptions.m_DisplayFlashedItemsFill ? 1 : 0); // Show Option Draw polygons m_OptDisplayPolygons->SetSelection( m_Parent->m_DisplayOptions.m_DisplayPolygonsFill ? 1 : 0 ); m_ShowPageLimits->SetSelection(0); if( m_Parent->GetShowBorderAndTitleBlock() ) { wxString curPaperType = m_Parent->GetPageSettings().GetType(); for( unsigned i = 1; i < DIM( g_GerberPageSizeList ); ++i ) { if( g_GerberPageSizeList[i] == curPaperType ) { m_ShowPageLimits->SetSelection( i ); break; } } } m_OptDisplayDCodes->SetValue( m_Parent->IsElementVisible( DCODES_VISIBLE ) ); m_OptZoomNoCenter->SetValue( m_Parent->GetCanvas()->GetEnableZoomNoCenter() ); m_OptMiddleButtonPan->SetValue( m_Parent->GetCanvas()->GetEnableMiddleButtonPan() ); m_OptMiddleButtonPanLimited->SetValue( m_Parent->GetCanvas()->GetMiddleButtonPanLimited() ); m_OptMiddleButtonPanLimited->Enable( m_OptMiddleButtonPan->GetValue() ); }
void DIALOG_PRINT_USING_PRINTER::InitValues( ) { SetFocus(); wxString msg; if( s_pageSetupData == NULL ) { s_pageSetupData = new wxPageSetupDialogData; // Set initial page margins. // Margins are already set in Gerbview, so we can use 0 s_pageSetupData->SetMarginTopLeft( wxPoint( 0, 0 ) ); s_pageSetupData->SetMarginBottomRight( wxPoint( 0, 0 ) ); } s_Parameters.m_PageSetupData = s_pageSetupData; GERBER_FILE_IMAGE_LIST* images = m_Parent->GetGerberLayout()->GetImagesList(); // Create layer list for( unsigned ii = 0; ii < images->ImagesMaxCount(); ++ii ) { msg = _( "Layer" ); msg << wxT( " " ) << ii + 1; wxStaticBoxSizer* boxSizer = ( ii < 16 ) ? m_leftLayersBoxSizer : m_rightLayersBoxSizer; m_BoxSelectLayer[ii] = new wxCheckBox( boxSizer->GetStaticBox(), wxID_ANY, msg ); boxSizer->Add( m_BoxSelectLayer[ii], wxGROW | wxLEFT | wxRIGHT | wxTOP ); if( images->GetGbrImage( ii ) == NULL ) // Nothing loaded on this draw layer m_BoxSelectLayer[ii]->Enable( false ); } // Read the scale adjust option int scale_idx = 4; // default selected scale = ScaleList[4] = 1.000 if( m_Config ) { m_Config->Read( OPTKEY_PRINT_X_FINESCALE_ADJ, &s_Parameters.m_XScaleAdjust ); m_Config->Read( OPTKEY_PRINT_Y_FINESCALE_ADJ, &s_Parameters.m_YScaleAdjust ); m_Config->Read( OPTKEY_PRINT_SCALE, &scale_idx ); m_Config->Read( OPTKEY_PRINT_PAGE_FRAME, &s_Parameters.m_Print_Sheet_Ref, 1 ); m_Config->Read( OPTKEY_PRINT_MONOCHROME_MODE, &s_Parameters.m_Print_Black_and_White, 1 ); // Test for a reasonnable scale value. Set to 1 if problem if( s_Parameters.m_XScaleAdjust < MIN_SCALE || s_Parameters.m_YScaleAdjust < MIN_SCALE || s_Parameters.m_XScaleAdjust > MAX_SCALE || s_Parameters.m_YScaleAdjust > MAX_SCALE ) s_Parameters.m_XScaleAdjust = s_Parameters.m_YScaleAdjust = 1.0; for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) { wxString layerKey; bool option; layerKey.Printf( OPTKEY_LAYERBASE, layer ); m_Config->Read( layerKey, &option, false ); m_BoxSelectLayer[layer]->SetValue( option ); } } m_ScaleOption->SetSelection( scale_idx ); scale_idx = m_ScaleOption->GetSelection(); s_Parameters.m_PrintScale = s_ScaleList[scale_idx]; m_Print_Mirror->SetValue( s_Parameters.m_PrintMirror ); if( s_Parameters.m_Print_Black_and_White ) m_ModeColorOption->SetSelection( 1 ); else m_ModeColorOption->SetSelection( 0 ); s_Parameters.m_PenDefaultSize = 0; // Create scale adjust option msg.Printf( wxT( "%f" ), s_Parameters.m_XScaleAdjust ); m_FineAdjustXscaleOpt->SetValue( msg ); msg.Printf( wxT( "%f" ), s_Parameters.m_YScaleAdjust ); m_FineAdjustYscaleOpt->SetValue( msg ); bool enable = (s_Parameters.m_PrintScale == 1.0); m_FineAdjustXscaleOpt->Enable(enable); m_FineAdjustYscaleOpt->Enable(enable); }
// Returns a color index from the layer id EDA_COLOR_T GBR_LAYER_BOX_SELECTOR::GetLayerColor( int aLayer ) const { GERBVIEW_FRAME* frame = (GERBVIEW_FRAME*) GetParent()->GetParent(); return frame->GetLayerColor( aLayer ); }
// Returns a color index from the layer id COLOR4D GBR_LAYER_BOX_SELECTOR::GetLayerColor( int aLayer ) const { GERBVIEW_FRAME* frame = (GERBVIEW_FRAME*) GetParent()->GetParent(); return frame->GetLayerColor( GERBER_DRAW_LAYER( aLayer ) ); }
void GERBER_DRAW_ITEM::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset ) { // used when a D_CODE is not found. default D_CODE to draw a flashed item static D_CODE dummyD_CODE( 0 ); EDA_COLOR_T color, alt_color; bool isFilled; int radius; int halfPenWidth; static bool show_err; D_CODE* d_codeDescr = GetDcodeDescr(); GERBVIEW_FRAME* gerbFrame = (GERBVIEW_FRAME*) aPanel->GetParent(); if( d_codeDescr == NULL ) d_codeDescr = &dummyD_CODE; if( gerbFrame->IsLayerVisible( GetLayer() ) == false ) return; color = gerbFrame->GetLayerColor( GetLayer() ); if( aDrawMode & GR_HIGHLIGHT ) ColorChangeHighlightFlag( &color, !(aDrawMode & GR_AND) ); ColorApplyHighlightFlag( &color ); alt_color = gerbFrame->GetNegativeItemsColor(); /* isDark is true if flash is positive and should use a drawing * color other than the background color, else use the background color * when drawing so that an erasure happens. */ bool isDark = !(m_LayerNegative ^ m_imageParams->m_ImageNegative); if( !isDark ) { // draw in background color ("negative" color) EXCHG( color, alt_color ); } GRSetDrawMode( aDC, aDrawMode ); isFilled = gerbFrame->DisplayLinesSolidMode(); switch( m_Shape ) { case GBR_POLYGON: isFilled = gerbFrame->DisplayPolygonsSolidMode(); if( !isDark ) isFilled = true; DrawGbrPoly( aPanel->GetClipBox(), aDC, color, aOffset, isFilled ); break; case GBR_CIRCLE: radius = KiROUND( GetLineLength( m_Start, m_End ) ); halfPenWidth = m_Size.x >> 1; if( !isFilled ) { // draw the border of the pen's path using two circles, each as narrow as possible GRCircle( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), radius - halfPenWidth, 0, color ); GRCircle( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), radius + halfPenWidth, 0, color ); } else // Filled mode { GRCircle( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), radius, m_Size.x, color ); } break; case GBR_ARC: // Currently, arcs plotted with a rectangular aperture are not supported. // a round pen only is expected. #if 0 // for arc debug only GRLine( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), GetABPosition( m_ArcCentre ), 0, color ); GRLine( aPanel->GetClipBox(), aDC, GetABPosition( m_End ), GetABPosition( m_ArcCentre ), 0, color ); #endif if( !isFilled ) { GRArc1( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), GetABPosition( m_End ), GetABPosition( m_ArcCentre ), 0, color ); } else { GRArc1( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), GetABPosition( m_End ), GetABPosition( m_ArcCentre ), m_Size.x, color ); } break; case GBR_SPOT_CIRCLE: case GBR_SPOT_RECT: case GBR_SPOT_OVAL: case GBR_SPOT_POLY: case GBR_SPOT_MACRO: isFilled = gerbFrame->DisplayFlashedItemsSolidMode(); d_codeDescr->DrawFlashedShape( this, aPanel->GetClipBox(), aDC, color, alt_color, m_Start, isFilled ); break; case GBR_SEGMENT: /* Plot a line from m_Start to m_End. * Usually, a round pen is used, but some gerber files use a rectangular pen * In fact, any aperture can be used to plot a line. * currently: only a square pen is handled (I believe using a polygon gives a strange plot). */ if( d_codeDescr->m_Shape == APT_RECT ) { if( m_PolyCorners.size() == 0 ) ConvertSegmentToPolygon( ); DrawGbrPoly( aPanel->GetClipBox(), aDC, color, aOffset, isFilled ); } else { if( !isFilled ) { GRCSegm( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), GetABPosition( m_End ), m_Size.x, color ); } else { GRFilledSegment( aPanel->GetClipBox(), aDC, GetABPosition( m_Start ), GetABPosition( m_End ), m_Size.x, color ); } } break; default: if( !show_err ) { wxMessageBox( wxT( "Trace_Segment() type error" ) ); show_err = true; } break; } }
bool EDA_APP::OnInit() { wxFileName fn; GERBVIEW_FRAME* frame = NULL; InitEDA_Appl( wxT( "GerbView" ), APP_GERBVIEW_T ); if( m_Checker && m_Checker->IsAnotherRunning() ) { if( !IsOK( NULL, _( "GerbView is already running. Continue?" ) ) ) return false; } // read current setup and reopen last directory if no filename to open in // command line bool reopenLastUsedDirectory = argc == 1; GetSettings( reopenLastUsedDirectory ); g_DrawBgColor = BLACK; /* Must be called before creating the main frame in order to * display the real hotkeys in menus or tool tips */ ReadHotkeyConfig( wxT("GerberFrame"), s_Gerbview_Hokeys_Descr ); frame = new GERBVIEW_FRAME( NULL, wxT( "GerbView" ), wxPoint( 0, 0 ), wxSize( 600, 400 ) ); /* Gerbview mainframe title */ frame->SetTitle( GetTitle() + wxT( " " ) + GetBuildVersion() ); SetTopWindow( frame ); // Set GerbView mainframe on top frame->Show( true ); // Show GerbView mainframe frame->Zoom_Automatique( true ); // Zoom fit in frame frame->GetScreen()->m_FirstRedraw = false; if( argc <= 1 ) return true; fn = argv[1]; if( fn.IsOk() ) { if( fn.DirExists() ) wxSetWorkingDirectory( fn.GetPath() ); // Load all files specified on the command line. LAYER_NUM jj = FIRST_LAYER; for( LAYER_NUM ii = LAYER_N_2; ii < argc && ii <= NB_GERBER_LAYERS; ++ii ) { fn = wxFileName( argv[ii] ); if( fn.FileExists() ) { frame->setActiveLayer( jj ); ++jj; frame->LoadGerberFiles( fn.GetFullPath() ); } } } return true; }