From 27346c7e796763f87cb4777cf8a06a7e0f7a95cf Mon Sep 17 00:00:00 2001 From: charras Date: Fri, 1 Jan 2010 13:30:39 +0000 Subject: [PATCH] Pcbnew and Gerbview: Refactor dialogs for plot and print. --- CHANGELOG.txt | 9 + common/CMakeLists.txt | 1 - eeschema/dialog_print_using_printer.cpp | 8 +- gerbview/CMakeLists.txt | 3 +- gerbview/dialog_print_using_printer.cpp | 440 ++++ gerbview/dialog_print_using_printer_base.cpp | 139 ++ gerbview/dialog_print_using_printer_base.fbp | 921 ++++++++ gerbview/dialog_print_using_printer_base.h | 76 + gerbview/files.cpp | 2 +- gerbview/pcbplot.cpp | 5 +- gerbview/pcbplot.h | 18 +- gerbview/wxGerberFrame.h | 14 +- include/pcbstruct.h | 25 + include/wxBasePcbFrame.h | 11 +- include/wxEeschemaStruct.h | 5 + include/wxPcbStruct.h | 53 +- include/wxstruct.h | 1 - internat/fr/kicad.mo | Bin 218955 -> 218364 bytes internat/fr/kicad.po | 574 ++--- pcbnew/CMakeLists.txt | 2 + pcbnew/dialog_layers_setup.cpp | 1 + pcbnew/dialog_plot_base.cpp | 258 +++ pcbnew/dialog_plot_base.fbp | 2070 ++++++++++++++++++ pcbnew/dialog_plot_base.h | 110 + pcbnew/dialog_print_using_printer.cpp | 108 +- pcbnew/pcbframe.cpp | 2 +- pcbnew/pcbnew_config.h | 4 + pcbnew/pcbplot.cpp | 580 ++--- pcbnew/plotdxf.cpp | 11 +- pcbnew/plotgerb.cpp | 22 +- pcbnew/plothpgl.cpp | 19 +- pcbnew/plotps.cpp | 11 +- 32 files changed, 4688 insertions(+), 815 deletions(-) create mode 100644 gerbview/dialog_print_using_printer.cpp create mode 100644 gerbview/dialog_print_using_printer_base.cpp create mode 100644 gerbview/dialog_print_using_printer_base.fbp create mode 100644 gerbview/dialog_print_using_printer_base.h create mode 100644 pcbnew/dialog_plot_base.cpp create mode 100644 pcbnew/dialog_plot_base.fbp create mode 100644 pcbnew/dialog_plot_base.h diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 9af8d7a3b5..24c312f77d 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,15 @@ KiCad ChangeLog 2009 Please add newer entries at the top, list the date and your name with email address. +2010-Jan-01 UPDATE Jean-Pierre Charras +================================================================================ +++pcbnew + Rewrite plot dialog using wxDialogBlocks. + Display layers list according to the Setup layers dialog order. +++Gerbview + Write Gerbview plot dialog using wxDialogBlocks. + Do not use anymore the Pcbnew one. + 2009-Dec-30 UPDATE Jean-Pierre Charras ================================================================================ ++pcbnew diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index d88257bfba..95bfbffb9a 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -83,7 +83,6 @@ set(PCB_COMMON_SRCS ../pcbnew/collectors.cpp ../pcbnew/sel_layer.cpp ../pcbnew/tracemod.cpp - ../pcbnew/dialog_print_using_printer_base.cpp ) add_library(pcbcommon ${PCB_COMMON_SRCS}) diff --git a/eeschema/dialog_print_using_printer.cpp b/eeschema/dialog_print_using_printer.cpp index 884bdeff66..ec81498988 100644 --- a/eeschema/dialog_print_using_printer.cpp +++ b/eeschema/dialog_print_using_printer.cpp @@ -41,11 +41,11 @@ static bool s_Print_Frame_Ref = true; class DIALOG_PRINT_USING_PRINTER : public DIALOG_PRINT_USING_PRINTER_base { private: - WinEDA_DrawFrame* m_Parent; + WinEDA_SchematicFrame* m_Parent; wxConfig* m_Config; public: - DIALOG_PRINT_USING_PRINTER( WinEDA_DrawFrame* parent ); + DIALOG_PRINT_USING_PRINTER( WinEDA_SchematicFrame* parent ); ~DIALOG_PRINT_USING_PRINTER() {}; private: @@ -93,7 +93,7 @@ public: /* Virtual function * Calls the print dialog for Eeschema */ -void WinEDA_DrawFrame::ToPrinter( wxCommandEvent& event ) +void WinEDA_SchematicFrame::ToPrinter( wxCommandEvent& event ) { if( g_PrintData == NULL ) // First call. creates print handlers { @@ -115,7 +115,7 @@ void WinEDA_DrawFrame::ToPrinter( wxCommandEvent& event ) } -DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( WinEDA_DrawFrame* parent ) : +DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( WinEDA_SchematicFrame* parent ) : DIALOG_PRINT_USING_PRINTER_base( parent ) { m_Parent = parent; diff --git a/gerbview/CMakeLists.txt b/gerbview/CMakeLists.txt index caf3cde0fe..9d8e526548 100644 --- a/gerbview/CMakeLists.txt +++ b/gerbview/CMakeLists.txt @@ -12,6 +12,8 @@ set(GERBVIEW_SRCS controle.cpp dcode.cpp deltrack.cpp + dialog_print_using_printer.cpp + dialog_print_using_printer_base.cpp dummy_functions.cpp edit.cpp export_to_pcbnew.cpp @@ -39,7 +41,6 @@ set(GERBVIEW_SRCS set(GERBVIEW_EXTRA_SRCS ../share/setpage.cpp - ../pcbnew/dialog_print_using_printer.cpp ../pcbnew/printout_controler.cpp ) diff --git a/gerbview/dialog_print_using_printer.cpp b/gerbview/dialog_print_using_printer.cpp new file mode 100644 index 0000000000..b384e25465 --- /dev/null +++ b/gerbview/dialog_print_using_printer.cpp @@ -0,0 +1,440 @@ +/****************************************/ +/* File: dialog_print_using_printer.cpp */ +/****************************************/ + +// Set this to 1 if you want to test PostScript printing under MSW. +#define wxTEST_POSTSCRIPT_IN_MSW 1 + +#include "fctsys.h" +#include "appl_wxstruct.h" +#include "common.h" +#include "class_drawpanel.h" +#include "confirm.h" + +#include "dialog_print_using_printer_base.h" +#include "printout_controler.h" + +#include "gerbview.h" +#include "wxGerberFrame.h" +#include "pcbnew.h" +#include "wxPcbStruct.h" +#include "pcbplot.h" +#include "class_board_design_settings.h" + +#define WIDTH_MAX_VALUE 1000 +#define WIDTH_MIN_VALUE 1 + +static long s_SelectedLayers; +static double s_ScaleList[] = +{ 0, 0.5, 0.7, 0.999, 1.0, 1.4, 2.0, 3.0, 4.0 }; + +// Define min et max reasonnable values for print scale +#define MIN_SCALE 0.01 +#define MAX_SCALE 100.0 + +// static print data and page setup data, to remember settings during the session +static wxPrintData* g_PrintData; + +// Variables locales +static PRINT_PARAMETERS s_Parameters; + + +/* Dialog to print schematic. Class derived from DIALOG_PRINT_USING_PRINTER_base + * created by wxFormBuilder + */ +class DIALOG_PRINT_USING_PRINTER : public DIALOG_PRINT_USING_PRINTER_base +{ +private: + WinEDA_GerberFrame* m_Parent; + wxConfig* m_Config; + wxCheckBox* m_BoxSelectLayer[32]; + static bool m_ExcludeEdgeLayer; + +public: + DIALOG_PRINT_USING_PRINTER( WinEDA_GerberFrame* parent ); + ~DIALOG_PRINT_USING_PRINTER() {}; + +private: + void OnCloseWindow( wxCloseEvent& event ); + void OnInitDialog( wxInitDialogEvent& event ); + void OnPrintSetup( wxCommandEvent& event ); + void OnPrintPreview( wxCommandEvent& event ); + void OnPrintButtonClick( wxCommandEvent& event ); + + void OnButtonCancelClick( wxCommandEvent& event ) { Close(); } + void SetPrintParameters( ); + void SetPenWidth(); + void InitValues( ); + +public: + bool IsMirrored() { return m_Print_Mirror->IsChecked(); } + bool PrintUsingSinglePage() { return m_PagesOption->GetSelection(); } + int SetLayerMaskFromListSelection(); +}; + +bool DIALOG_PRINT_USING_PRINTER::m_ExcludeEdgeLayer; + + + +/*******************************************************/ +void WinEDA_GerberFrame::ToPrinter( wxCommandEvent& event ) +/*******************************************************/ + +/* Virtual function: + * Display the print dialog + */ +{ + if( g_PrintData == NULL ) // First print + { + g_PrintData = new wxPrintData(); + + if( !g_PrintData->Ok() ) + { + DisplayError( this, _( "Error Init Printer info" ) ); + } + g_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGHT; + g_PrintData->SetOrientation( DEFAULT_ORIENTATION_PAPER ); + } + + DIALOG_PRINT_USING_PRINTER* frame = new DIALOG_PRINT_USING_PRINTER( this ); + + frame->ShowModal(); frame->Destroy(); +} + + +/*************************************************************************************/ +DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( WinEDA_GerberFrame* parent ) : + DIALOG_PRINT_USING_PRINTER_base( parent ) +/*************************************************************************************/ +{ + m_Parent = parent; + m_Config = wxGetApp().m_EDA_Config; + + InitValues( ); + + if( GetSizer() ) + { + GetSizer()->SetSizeHints( this ); + } +} + + +/************************************************************************/ +void DIALOG_PRINT_USING_PRINTER::InitValues( ) +/************************************************************************/ +{ + SetFocus(); + int layer_max = NB_LAYERS; + wxString msg; + + layer_max = 32; + m_ExcludeEdgeLayer = true; // no meaning in gerbview + + /* Create layer list */ + int mask = 1, ii; + for( ii = 0; ii < layer_max; ii++, mask <<= 1 ) + { + msg = _( "Layer" ); + msg << wxT( " " ) << ii + 1; + m_BoxSelectLayer[ii] = new wxCheckBox( this, -1, msg ); + + if( mask & s_SelectedLayers ) + m_BoxSelectLayer[ii]->SetValue( TRUE ); + if( ii < 16 ) + m_leftLayersBoxSizer->Add( m_BoxSelectLayer[ii], + wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE ); + else + m_rightLayersBoxSizer->Add( m_BoxSelectLayer[ii], + wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE ); + } + + + // Read the scale adjust option + int scale_idx = 4; // default selected scale = ScaleList[4] = 1.000 + + if( m_Config ) + { + m_Config->Read( OPTKEY_PLOT_LINEWIDTH_VALUE, &s_Parameters.m_PenMinSize ); + 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; + + s_SelectedLayers = 0; + for( int layer = 0; layerRead( layerKey, &option ) ) + { + m_BoxSelectLayer[layer]->SetValue( option ); + if( option ) + s_SelectedLayers |= 1 << layer; + } + } + } + + // Disable checkboxes if the corresponding layer is not enabled + BOARD* board = ((WinEDA_BasePcbFrame*)m_Parent)->GetBoard(); + for( int layer = 0; layerm_BoardSettings->IsLayerEnabled( layer ) ) + { + m_BoxSelectLayer[layer]->Enable( false ); + m_BoxSelectLayer[layer]->SetValue( false ); + } + } + + m_ScaleOption->SetSelection( 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 ); + + AddUnitSymbol( *m_TextPenWidth, g_UnitMetric ); + m_DialogPenWidth->SetValue( + ReturnStringFromValue( g_UnitMetric, s_Parameters.m_PenMinSize, m_Parent->m_InternalUnits ) ); + + + // 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 ); +} + + +/**************************************************************/ +int DIALOG_PRINT_USING_PRINTER::SetLayerMaskFromListSelection() +/**************************************************************/ +{ + int page_count; + s_Parameters.m_PrintMaskLayer = 0; + int ii; + for( ii = 0, page_count = 0; ii < LAYER_COUNT; ii++ ) + { + if( m_BoxSelectLayer[ii]->IsChecked() ) + { + page_count++; + s_Parameters.m_PrintMaskLayer |= 1 << ii; + } + } + + s_Parameters.m_PageCount = page_count; + + return page_count; +} + + +/********************************************************************/ +void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event ) +/********************************************************************/ +{ + SetPrintParameters(); + + if( m_Config ) + { + m_Config->Write( OPTKEY_PLOT_LINEWIDTH_VALUE, s_Parameters.m_PenMinSize ); + m_Config->Write( OPTKEY_PRINT_X_FINESCALE_ADJ, s_Parameters.m_XScaleAdjust ); + m_Config->Write( OPTKEY_PRINT_Y_FINESCALE_ADJ, s_Parameters.m_YScaleAdjust ); + m_Config->Write( OPTKEY_PRINT_SCALE, m_ScaleOption->GetSelection() ); + m_Config->Write( OPTKEY_PRINT_PAGE_FRAME, s_Parameters.m_Print_Sheet_Ref); + m_Config->Write( OPTKEY_PRINT_MONOCHROME_MODE, s_Parameters.m_Print_Black_and_White); + wxString layerKey; + for( int layer = 0; layer < LAYER_COUNT; ++layer ) + { + layerKey.Printf( OPTKEY_LAYERBASE, layer ); + m_Config->Write( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); + } + } + EndModal( 0 ); +} + + +/******************************************************************/ +void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) +/******************************************************************/ +{ + s_Parameters.m_PrintMirror = m_Print_Mirror->GetValue(); + s_Parameters.m_Print_Black_and_White = + m_ModeColorOption->GetSelection() != 0; + + if( m_PagesOption ) + s_Parameters.m_OptionPrintPage = m_PagesOption->GetSelection() != 0; + + + SetLayerMaskFromListSelection(); + + int idx = m_ScaleOption->GetSelection(); + s_Parameters.m_PrintScale = s_ScaleList[idx]; + g_pcb_plot_options.Scale = s_Parameters.m_PrintScale; + + if( m_FineAdjustXscaleOpt ) + { + if( s_Parameters.m_XScaleAdjust > MAX_SCALE || + s_Parameters.m_YScaleAdjust > MAX_SCALE ) + DisplayInfoMessage( NULL, _( "Warning: Scale option set to a very large value" ) ); + m_FineAdjustXscaleOpt->GetValue().ToDouble( &s_Parameters.m_XScaleAdjust ); + } + if( m_FineAdjustYscaleOpt ) + { + // Test for a reasonnable scale value + if( s_Parameters.m_XScaleAdjust < MIN_SCALE || + s_Parameters.m_YScaleAdjust < MIN_SCALE ) + DisplayInfoMessage( NULL, _( "Warning: Scale option set to a very small value" ) ); + m_FineAdjustYscaleOpt->GetValue().ToDouble( &s_Parameters.m_YScaleAdjust ); + } + g_pcb_plot_options.ScaleAdjX = s_Parameters.m_XScaleAdjust; + g_pcb_plot_options.ScaleAdjX = s_Parameters.m_YScaleAdjust; + SetPenWidth(); +} + + +/**********************************************/ +void DIALOG_PRINT_USING_PRINTER::SetPenWidth() +/***********************************************/ + +/* Get the new pen width value, and verify min et max value + * NOTE: s_Parameters.m_PenMinSize is in internal units + */ +{ + s_Parameters.m_PenMinSize = ReturnValueFromTextCtrl( *m_DialogPenWidth, m_Parent->m_InternalUnits ); + + if( s_Parameters.m_PenMinSize > WIDTH_MAX_VALUE ) + { + s_Parameters.m_PenMinSize = WIDTH_MAX_VALUE; + } + + if( s_Parameters.m_PenMinSize < WIDTH_MIN_VALUE ) + { + s_Parameters.m_PenMinSize = WIDTH_MIN_VALUE; + } + + m_DialogPenWidth->SetValue( + ReturnStringFromValue( g_UnitMetric, s_Parameters.m_PenMinSize, m_Parent->m_InternalUnits ) ); +} + + +/**********************************************************/ +void DIALOG_PRINT_USING_PRINTER::OnPrintSetup( wxCommandEvent& event ) +/**********************************************************/ + +/* Open a dialog box for printer setup (printer options, page size ...) + */ +{ + wxPrintDialogData printDialogData( *g_PrintData ); + + if( printDialogData.Ok() ) + { + wxPrintDialog printerDialog( this, &printDialogData ); + + printerDialog.ShowModal(); + + *g_PrintData = printerDialog.GetPrintDialogData().GetPrintData(); + } + else + DisplayError( this, _( "Printer Problem!" ) ); +} + + +/************************************************************/ +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_CONTROLER( s_Parameters, m_Parent, title ), + new BOARD_PRINTOUT_CONTROLER( 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 ); +} + + +/***************************************************************************/ +void DIALOG_PRINT_USING_PRINTER::OnPrintButtonClick( wxCommandEvent& event ) +/***************************************************************************/ + +/* Called on activate Print button + */ +{ + 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( s_Parameters.m_PrintMaskLayer == 0 ) + { + DisplayError( this, _( "No layer selected" ) ); + return; + } + + wxPrintDialogData printDialogData( *g_PrintData ); + + wxPrinter printer( &printDialogData ); + + wxString title = _( "Print" ); + BOARD_PRINTOUT_CONTROLER printout( s_Parameters, m_Parent, title ); + +#if !defined(__WINDOWS__) && !wxCHECK_VERSION(2,9,0) + wxDC* dc = printout.GetDC(); + ( (wxPostScriptDC*) dc )->SetResolution( 600 ); // Postscript DC resolution is 600 ppi +#endif + + if( !printer.Print( this, &printout, TRUE ) ) + { + if( wxPrinter::GetLastError() == wxPRINTER_ERROR ) + DisplayError( this, _( "There was a problem printing" ) ); + return; + } + else + { + *g_PrintData = printer.GetPrintDialogData().GetPrintData(); + } +} + diff --git a/gerbview/dialog_print_using_printer_base.cpp b/gerbview/dialog_print_using_printer_base.cpp new file mode 100644 index 0000000000..da5b612d1b --- /dev/null +++ b/gerbview/dialog_print_using_printer_base.cpp @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_print_using_printer_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_PRINT_USING_PRINTER_base::DIALOG_PRINT_USING_PRINTER_base( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + + wxBoxSizer* bMainSizer; + bMainSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbLayersSizer; + sbLayersSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxVERTICAL ); + + wxBoxSizer* bleftSizer; + bleftSizer = new wxBoxSizer( wxHORIZONTAL ); + + m_leftLayersBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxVERTICAL ); + + bleftSizer->Add( m_leftLayersBoxSizer, 1, wxALL, 5 ); + + m_rightLayersBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxVERTICAL ); + + bleftSizer->Add( m_rightLayersBoxSizer, 1, wxALL, 5 ); + + sbLayersSizer->Add( bleftSizer, 1, wxEXPAND, 5 ); + + bMainSizer->Add( sbLayersSizer, 1, wxEXPAND, 5 ); + + wxBoxSizer* bmiddleLeftSizer; + bmiddleLeftSizer = new wxBoxSizer( wxVERTICAL ); + + wxString m_ScaleOptionChoices[] = { _("fit in page"), _("Scale 0.5"), _("Scale 0.7"), _("Approx. Scale 1"), _("Accurate Scale 1"), _("Scale 1.4"), _("Scale 2"), _("Scale 3"), _("Scale 4") }; + int m_ScaleOptionNChoices = sizeof( m_ScaleOptionChoices ) / sizeof( wxString ); + m_ScaleOption = new wxRadioBox( this, wxID_ANY, _("Approx. Scale:"), wxDefaultPosition, wxDefaultSize, m_ScaleOptionNChoices, m_ScaleOptionChoices, 1, wxRA_SPECIFY_COLS ); + m_ScaleOption->SetSelection( 3 ); + bmiddleLeftSizer->Add( m_ScaleOption, 0, wxALL, 5 ); + + m_FineAdjustXscaleTitle = new wxStaticText( this, wxID_ANY, _("X Scale Adjust"), wxDefaultPosition, wxDefaultSize, 0 ); + m_FineAdjustXscaleTitle->Wrap( -1 ); + bmiddleLeftSizer->Add( m_FineAdjustXscaleTitle, 0, wxRIGHT|wxLEFT, 5 ); + + m_FineAdjustXscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_FineAdjustXscaleOpt->SetToolTip( _("Set X scale adjust for exact scale plotting") ); + + bmiddleLeftSizer->Add( m_FineAdjustXscaleOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_FineAdjustYscaleTitle = new wxStaticText( this, wxID_ANY, _("Y Scale Adjust"), wxDefaultPosition, wxDefaultSize, 0 ); + m_FineAdjustYscaleTitle->Wrap( -1 ); + bmiddleLeftSizer->Add( m_FineAdjustYscaleTitle, 0, wxRIGHT|wxLEFT, 5 ); + + m_FineAdjustYscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_FineAdjustYscaleOpt->SetToolTip( _("Set Y scale adjust for exact scale plotting") ); + + bmiddleLeftSizer->Add( m_FineAdjustYscaleOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + bMainSizer->Add( bmiddleLeftSizer, 0, wxEXPAND, 5 ); + + wxBoxSizer* bmiddleRightSizer; + bmiddleRightSizer = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbOptionsSizer; + sbOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Options:") ), wxVERTICAL ); + + m_TextPenWidth = new wxStaticText( this, wxID_ANY, _("Pen Width Mini"), wxDefaultPosition, wxDefaultSize, 0 ); + m_TextPenWidth->Wrap( -1 ); + sbOptionsSizer->Add( m_TextPenWidth, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_DialogPenWidth = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_DialogPenWidth->SetToolTip( _("Selection of the minimum pen thickness used to draw items.") ); + + sbOptionsSizer->Add( m_DialogPenWidth, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_Print_Mirror = new wxCheckBox( this, wxID_ANY, _("Mirror"), wxDefaultPosition, wxDefaultSize, 0 ); + + sbOptionsSizer->Add( m_Print_Mirror, 0, wxALL, 5 ); + + bmiddleRightSizer->Add( sbOptionsSizer, 0, wxEXPAND|wxALL, 5 ); + + wxString m_ModeColorOptionChoices[] = { _("Color"), _("Black and white") }; + int m_ModeColorOptionNChoices = sizeof( m_ModeColorOptionChoices ) / sizeof( wxString ); + m_ModeColorOption = new wxRadioBox( this, wxID_PRINT_MODE, _("Print Mode"), wxDefaultPosition, wxDefaultSize, m_ModeColorOptionNChoices, m_ModeColorOptionChoices, 1, wxRA_SPECIFY_COLS ); + m_ModeColorOption->SetSelection( 1 ); + m_ModeColorOption->SetToolTip( _("Choose if you wand 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") ); + + bmiddleRightSizer->Add( m_ModeColorOption, 0, wxALL|wxEXPAND, 5 ); + + wxString m_PagesOptionChoices[] = { _("1 Page per Layer"), _("Single page") }; + int m_PagesOptionNChoices = sizeof( m_PagesOptionChoices ) / sizeof( wxString ); + m_PagesOption = new wxRadioBox( this, wxID_PAGE_MODE, _("Page Print"), wxDefaultPosition, wxDefaultSize, m_PagesOptionNChoices, m_PagesOptionChoices, 1, wxRA_SPECIFY_COLS ); + m_PagesOption->SetSelection( 0 ); + bmiddleRightSizer->Add( m_PagesOption, 0, wxALL|wxEXPAND, 5 ); + + bMainSizer->Add( bmiddleRightSizer, 0, wxEXPAND, 5 ); + + wxBoxSizer* b_buttonsSizer; + b_buttonsSizer = new wxBoxSizer( wxVERTICAL ); + + m_buttonOption = new wxButton( this, wxID_PRINT_OPTIONS, _("Page Options"), wxDefaultPosition, wxDefaultSize, 0 ); + b_buttonsSizer->Add( m_buttonOption, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonPreview = new wxButton( this, wxID_PREVIEW, _("Preview"), wxDefaultPosition, wxDefaultSize, 0 ); + b_buttonsSizer->Add( m_buttonPreview, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonPrint = new wxButton( this, wxID_PRINT_ALL, _("Print"), wxDefaultPosition, wxDefaultSize, 0 ); + b_buttonsSizer->Add( m_buttonPrint, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); + b_buttonsSizer->Add( m_buttonQuit, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bMainSizer->Add( b_buttonsSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + this->SetSizer( bMainSizer ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnCloseWindow ) ); + m_buttonOption->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintSetup ), NULL, this ); + m_buttonPreview->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintPreview ), NULL, this ); + m_buttonPrint->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintButtonClick ), NULL, this ); + m_buttonQuit->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnButtonCancelClick ), NULL, this ); +} + +DIALOG_PRINT_USING_PRINTER_base::~DIALOG_PRINT_USING_PRINTER_base() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnCloseWindow ) ); + m_buttonOption->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintSetup ), NULL, this ); + m_buttonPreview->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintPreview ), NULL, this ); + m_buttonPrint->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnPrintButtonClick ), NULL, this ); + m_buttonQuit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_base::OnButtonCancelClick ), NULL, this ); +} diff --git a/gerbview/dialog_print_using_printer_base.fbp b/gerbview/dialog_print_using_printer_base.fbp new file mode 100644 index 0000000000..210850bd59 --- /dev/null +++ b/gerbview/dialog_print_using_printer_base.fbp @@ -0,0 +1,921 @@ + + + + + + C++ + 1 + UTF-8 + connect + dialog_print_using_printer_base + 1000 + none + 1 + DialogPrint_base + + . + + 1 + 1 + 0 + + + + + 1 + + + + 0 + wxID_ANY + + -1,-1 + DIALOG_PRINT_USING_PRINTER_base + + 551,314 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Print + + + + + + + + OnCloseWindow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bMainSizer + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + wxID_ANY + Layers: + + sbLayersSizer + wxVERTICAL + none + + + 5 + wxEXPAND + 1 + + + bleftSizer + wxHORIZONTAL + none + + 5 + wxALL + 1 + + wxID_ANY + Layers: + + m_leftLayersBoxSizer + wxVERTICAL + protected + + + + + 5 + wxALL + 1 + + wxID_ANY + Layers: + + m_rightLayersBoxSizer + wxVERTICAL + protected + + + + + + + + + 5 + wxEXPAND + 0 + + + bmiddleLeftSizer + wxVERTICAL + none + + 5 + wxALL + 0 + + + "fit in page" "Scale 0.5" "Scale 0.7" "Approx. Scale 1" "Accurate Scale 1" "Scale 1.4" "Scale 2" "Scale 3" "Scale 4" + + 1 + + + 0 + wxID_ANY + Approx. Scale: + 1 + + + m_ScaleOption + protected + + 3 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + X Scale Adjust + + + m_FineAdjustXscaleTitle + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_FineAdjustXscaleOpt + protected + + + + + Set X scale adjust for exact scale plotting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Y Scale Adjust + + + m_FineAdjustYscaleTitle + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_FineAdjustYscaleOpt + protected + + + + + Set Y scale adjust for exact scale plotting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bmiddleRightSizer + wxVERTICAL + none + + 5 + wxEXPAND|wxALL + 0 + + wxID_ANY + Options: + + sbOptionsSizer + wxVERTICAL + none + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Pen Width Mini + + + m_TextPenWidth + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + -1,-1 + m_DialogPenWidth + protected + + + + + Selection of the minimum pen thickness used to draw items. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Mirror + + + m_Print_Mirror + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Color" "Black and white" + + 1 + + + 0 + wxID_PRINT_MODE + Print Mode + 1 + + + m_ModeColorOption + protected + + 1 + + wxRA_SPECIFY_COLS + + Choose if you wand to draw the sheet like it appears on screen, or in black and white mode, better to print it when using black and white printers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "1 Page per Layer" "Single page" + + 1 + + + 0 + wxID_PAGE_MODE + Page Print + 1 + + + m_PagesOption + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + b_buttonsSizer + wxVERTICAL + none + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_PRINT_OPTIONS + Page Options + + + m_buttonOption + protected + + + + + + + + + OnPrintSetup + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_PREVIEW + Preview + + + m_buttonPreview + protected + + + + + + + + + OnPrintPreview + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_PRINT_ALL + Print + + + m_buttonPrint + protected + + + + + + + + + OnPrintButtonClick + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_CANCEL + Close + + + m_buttonQuit + protected + + + + + + + + + OnButtonCancelClick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gerbview/dialog_print_using_printer_base.h b/gerbview/dialog_print_using_printer_base.h new file mode 100644 index 0000000000..9487e7db93 --- /dev/null +++ b/gerbview/dialog_print_using_printer_base.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __dialog_print_using_printer_base__ +#define __dialog_print_using_printer_base__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_PRINT_USING_PRINTER_base +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_PRINT_USING_PRINTER_base : public wxDialog +{ + private: + + protected: + enum + { + wxID_PRINT_MODE = 1000, + wxID_PAGE_MODE, + wxID_PRINT_OPTIONS, + wxID_PRINT_ALL, + }; + + wxStaticBoxSizer* m_leftLayersBoxSizer; + wxStaticBoxSizer* m_rightLayersBoxSizer; + wxRadioBox* m_ScaleOption; + wxStaticText* m_FineAdjustXscaleTitle; + wxTextCtrl* m_FineAdjustXscaleOpt; + wxStaticText* m_FineAdjustYscaleTitle; + wxTextCtrl* m_FineAdjustYscaleOpt; + wxStaticText* m_TextPenWidth; + wxTextCtrl* m_DialogPenWidth; + wxCheckBox* m_Print_Mirror; + wxRadioBox* m_ModeColorOption; + wxRadioBox* m_PagesOption; + wxButton* m_buttonOption; + wxButton* m_buttonPreview; + wxButton* m_buttonPrint; + wxButton* m_buttonQuit; + + // Virtual event handlers, overide them in your derived class + virtual void OnCloseWindow( wxCloseEvent& event ){ event.Skip(); } + virtual void OnPrintSetup( wxCommandEvent& event ){ event.Skip(); } + virtual void OnPrintPreview( wxCommandEvent& event ){ event.Skip(); } + virtual void OnPrintButtonClick( wxCommandEvent& event ){ event.Skip(); } + virtual void OnButtonCancelClick( wxCommandEvent& event ){ event.Skip(); } + + + public: + DIALOG_PRINT_USING_PRINTER_base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Print"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 551,314 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_PRINT_USING_PRINTER_base(); + +}; + +#endif //__dialog_print_using_printer_base__ diff --git a/gerbview/files.cpp b/gerbview/files.cpp index 8fe166380b..a1f5ac0ad4 100644 --- a/gerbview/files.cpp +++ b/gerbview/files.cpp @@ -116,7 +116,7 @@ bool WinEDA_GerberFrame::LoadOneGerberFile( const wxString& FullFileName, */ filetypes = _( "Gerber files (.gb* .gt* .lgr .ger .pho)" ); filetypes << wxT("|"); - filetypes += wxT("*.gb*;*.GB*;.gt*;.GT*;.gko;.GKO;*.GPB;*.gpb;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO" ); + filetypes += wxT("*.gb*;*.GB*;*.gt*;*.GT*;*.gko;*.GKO;*.GPB;*.gpb;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO" ); filetypes << wxT("|"); /* Special gerber filetypes */ diff --git a/gerbview/pcbplot.cpp b/gerbview/pcbplot.cpp index 3847105b0c..f6d1c07aee 100644 --- a/gerbview/pcbplot.cpp +++ b/gerbview/pcbplot.cpp @@ -19,9 +19,8 @@ PCB_Plot_Options g_pcb_plot_options; /* void WinEDA_BasePcbFrame::ToPlotter(wxCommandEvent& event) */ /***************************************************************/ -void WinEDA_BasePcbFrame::ToPlotter(wxCommandEvent& event) +/** TODO */ +void WinEDA_GerberFrame::ToPlotter(wxCommandEvent& event) { -// WinEDA_PlotFrame * frame = new WinEDA_PlotFrame(this); -// frame->ShowModal(); frame->Destroy(); } diff --git a/gerbview/pcbplot.h b/gerbview/pcbplot.h index 6f480700db..f66930cf8a 100644 --- a/gerbview/pcbplot.h +++ b/gerbview/pcbplot.h @@ -11,6 +11,8 @@ #define OPTKEY_PRINT_X_FINESCALE_ADJ wxT( "PrintXFineScaleAdj" ) #define OPTKEY_PRINT_Y_FINESCALE_ADJ wxT( "PrintYFineScaleAdj" ) #define OPTKEY_PRINT_SCALE wxT( "PrintScale" ) +#define OPTKEY_PRINT_PAGE_FRAME wxT( "PrintPageFrame" ) +#define OPTKEY_PRINT_MONOCHROME_MODE wxT( "PrintMonochrome" ) /* Plot Options : */ struct PCB_Plot_Options @@ -18,8 +20,6 @@ struct PCB_Plot_Options bool Exclude_Edges_Pcb; int PlotLine_Width; bool Plot_Frame_Ref; // True to plot/print frame references - bool DrawViaOnMaskLayer; // True if vias are drawn on Mask layer - // (ie protected by mask) int Plot_Mode; bool Plot_Set_MIROIR; bool Sel_Rotate_Window; @@ -31,22 +31,14 @@ struct PCB_Plot_Options int PlotPSColorOpt; // True for color Postscript output bool Plot_PS_Negative; // True to create a negative board ps plot - /* Settings to trace the various items in silkscreen. */ - bool Sel_Texte_Reference; - bool Sel_Texte_Valeur; - bool Sel_Texte_Divers; - bool Sel_Texte_Invisible; - bool PlotPadsOnSilkLayer; - /* Plot pads even outside the layer (useful for silkscreen) */ - bool Plot_Pads_All_Layers; - /* id for plot format (see enum PlotFormat in plot_common.h) */ int PlotFormat; int PlotOrient; int PlotScaleOpt; int DrillShapeOpt; - double Scale_X; - double Scale_Y; + double Scale; + double ScaleAdjX; + double ScaleAdjY; }; extern PCB_Plot_Options g_pcb_plot_options; diff --git a/gerbview/wxGerberFrame.h b/gerbview/wxGerberFrame.h index 56301333e8..980ac2d636 100644 --- a/gerbview/wxGerberFrame.h +++ b/gerbview/wxGerberFrame.h @@ -1,5 +1,5 @@ /***********************************************************/ -/* wxGerberStruct.h: */ +/* wxGerberFrame.h: */ /***********************************************************/ #ifndef WX_GERBER_STRUCT_H @@ -145,6 +145,18 @@ public: void InstallDrillFrame( wxCommandEvent& event ); void ToPostProcess( wxCommandEvent& event ); + + /** Function ToPlotter + * Open a dialog frame to create plot and drill files + * relative to the current board + */ + void ToPlotter( wxCommandEvent& event ); + + /** Function ToPrinter + * Open a dialog frame to print layers + */ + void ToPrinter( wxCommandEvent& event ); + void Genere_HPGL( const wxString& FullFileName, int Layers ); void Genere_GERBER( const wxString& FullFileName, int Layers ); void Genere_PS( const wxString& FullFileName, int Layers ); diff --git a/include/pcbstruct.h b/include/pcbstruct.h index ef3d2dd393..692dd2b086 100644 --- a/include/pcbstruct.h +++ b/include/pcbstruct.h @@ -69,6 +69,9 @@ #define ECO2_N 27 #define EDGE_N 28 #define LAST_NO_COPPER_LAYER 28 +#define UNUSED_LAYER_29 29 +#define UNUSED_LAYER_30 30 +#define UNUSED_LAYER_31 31 #define NB_LAYERS (LAST_NO_COPPER_LAYER + 1) #define LAYER_COUNT 32 @@ -116,6 +119,28 @@ #define INTERNAL_LAYERS 0x00007FFE #define EXTERNAL_LAYERS 0x00008001 + +// layers order in dialogs (plot, print and toolbars) +// in same order than in setup layers dialog +// (Front or Top to Back or Bottom) +#define DECLARE_LAYERS_ORDER_LIST(list) int list[LAYER_COUNT] =\ +{ LAYER_N_FRONT,\ + LAYER_N_15, LAYER_N_14, LAYER_N_13, LAYER_N_12,\ + LAYER_N_11, LAYER_N_10, LAYER_N_9, LAYER_N_8,\ + LAYER_N_7, LAYER_N_6, LAYER_N_5, LAYER_N_4,\ + LAYER_N_3, LAYER_N_2,\ + LAYER_N_BACK,\ + ADHESIVE_N_FRONT , ADHESIVE_N_BACK,\ + SOLDERPASTE_N_FRONT, SOLDERPASTE_N_BACK,\ + SILKSCREEN_N_FRONT, SILKSCREEN_N_BACK,\ + SOLDERMASK_N_FRONT, SOLDERMASK_N_BACK,\ + DRAW_N,\ + COMMENT_N,\ + ECO1_N, ECO2_N,\ + EDGE_N,\ + UNUSED_LAYER_29, UNUSED_LAYER_30, UNUSED_LAYER_31\ +}; + class NETINFO_ITEM; class MARKER_PCB; class RATSNEST_ITEM; diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h index 3fddd5af16..b15a00c9c0 100644 --- a/include/wxBasePcbFrame.h +++ b/include/wxBasePcbFrame.h @@ -305,20 +305,21 @@ public: void RecalculateAllTracksNetcode(); /* Plotting functions: + * Return true if OK, false if the file is not created (or has a problem) */ - void ToPlotter( wxCommandEvent& event ); - void Genere_GERBER( const wxString& FullFileName, + + bool Genere_GERBER( const wxString& FullFileName, int Layer, bool PlotOriginIsAuxAxis, GRTraceMode trace_mode ); - void Genere_HPGL( const wxString& FullFileName, + bool Genere_HPGL( const wxString& FullFileName, int Layer, GRTraceMode trace_mode ); - void Genere_PS( const wxString& FullFileName, + bool Genere_PS( const wxString& FullFileName, int Layer, bool useA4, GRTraceMode trace_mode ); - void Genere_DXF( const wxString& FullFileName, + bool Genere_DXF( const wxString& FullFileName, int Layer, GRTraceMode trace_mode ); void Plot_Layer( PLOTTER* plotter, diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index fed06c2a41..dec44de1bc 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -202,6 +202,11 @@ public: */ void SetSheetNumberAndCount(); + /** function ToPrinter + * Install the print dialog + */ + void ToPrinter( wxCommandEvent& event ); + // Plot functions: void ToPlot_PS( wxCommandEvent& event ); void ToPlot_HPGL( wxCommandEvent& event ); diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 2ddb8c1737..79edf15d50 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -87,6 +87,17 @@ public: ~WinEDA_PcbFrame(); + /** Function ToPlotter + * Open a dialog frame to create plot and drill files + * relative to the current board + */ + void ToPlotter( wxCommandEvent& event ); + + /** function ToPrinter + * Install the print dialog + */ + void ToPrinter( wxCommandEvent& event ); + void GetKicadAbout( wxCommandEvent& event ); // Configurations: @@ -183,9 +194,9 @@ public: *commands like move */ virtual void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, - UndoRedoOpType aTypeCommand, - const wxPoint& aTransformPoint = - wxPoint( 0, 0 ) ); + UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = + wxPoint( 0, 0 ) ); /** Function SaveCopyInUndoList (overloaded). * Creates a new entry in undo list of commands. @@ -196,9 +207,9 @@ public: *commands like move */ virtual void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, - UndoRedoOpType aTypeCommand, - const wxPoint& aTransformPoint = - wxPoint( 0, 0 ) ); + UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = + wxPoint( 0, 0 ) ); /** Function PutDataInPreviousState() * Used in undo or redo command. @@ -859,10 +870,10 @@ public: * @param aTransformPoint = the reference point of the transformation, for * commands like move */ - virtual void SaveCopyInUndoList( BOARD_ITEM* aItem, - UndoRedoOpType aTypeCommand, - const wxPoint& aTransformPoint = - wxPoint( 0, 0 ) ); + virtual void SaveCopyInUndoList( BOARD_ITEM* aItem, + UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = + wxPoint( 0, 0 ) ); /** Function SaveCopyInUndoList (overloaded). * Creates a new entry in undo list of commands. @@ -873,25 +884,25 @@ public: * commands like move */ virtual void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, - UndoRedoOpType aTypeCommand, - const wxPoint& aTransformPoint = - wxPoint( 0, 0 ) ); + UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = + wxPoint( 0, 0 ) ); private: - void GetComponentFromUndoList( wxCommandEvent& event ); - void GetComponentFromRedoList( wxCommandEvent& event ); + void GetComponentFromUndoList( wxCommandEvent& event ); + void GetComponentFromRedoList( wxCommandEvent& event ); public: // Footprint edition - void Place_Ancre( MODULE* module ); - void RemoveStruct( EDA_BaseStruct* Item ); - void Transform( MODULE* module, int transform ); + void Place_Ancre( MODULE* module ); + void RemoveStruct( EDA_BaseStruct* Item ); + void Transform( MODULE* module, int transform ); // loading Footprint - MODULE* Import_Module( wxDC* DC ); - void Export_Module( MODULE* ptmod, bool createlib ); - void Load_Module_From_BOARD( MODULE* Module ); + MODULE* Import_Module( wxDC* DC ); + void Export_Module( MODULE* ptmod, bool createlib ); + void Load_Module_From_BOARD( MODULE* Module ); // functions to edit footprint edges diff --git a/include/wxstruct.h b/include/wxstruct.h index 30a1dc0ba6..cd443566ec 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -269,7 +269,6 @@ public: /* Return the current zoom level */ int GetZoom( void ); - void ToPrinter( wxCommandEvent& event ); void SVG_Print( wxCommandEvent& event ); void TraceWorkSheet( wxDC* DC, BASE_SCREEN* screen, int line_width ); diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index 99d41d09417917e37c8546be585e0551f8129df5..75a2d2bbfde89adc2a7319c751ac3a3bf16a2548 100644 GIT binary patch delta 59571 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 Z*u~pY;gxgxtd^U}UHpUNGB$Q8{6Amaj&1+| delta 59891 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 diff --git a/internat/fr/kicad.po b/internat/fr/kicad.po index 5f7163580b..50cae68219 100644 --- a/internat/fr/kicad.po +++ b/internat/fr/kicad.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: kicad\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-30 18:30+0100\n" -"PO-Revision-Date: 2009-12-30 18:34+0100\n" +"POT-Creation-Date: 2010-01-01 10:53+0100\n" +"PO-Revision-Date: 2010-01-01 10:54+0100\n" "Last-Translator: \n" "Language-Team: kicad team \n" "MIME-Version: 1.0\n" @@ -1525,10 +1525,6 @@ msgstr "Rot de la forme" msgid "3D Shape:" msgstr "Forme 3D:" -#: pcbnew/plotdxf.cpp:31 -msgid "File" -msgstr "Fichier" - #: pcbnew/set_color.cpp:278 #: pcbnew/set_color.cpp:304 msgid "Show None" @@ -2423,244 +2419,20 @@ msgstr "&3D Visu" msgid "&Help" msgstr "&Aide" -#: pcbnew/pcbplot.cpp:184 -#: pcbnew/pcbplot.cpp:328 -msgid "Plot" -msgstr "Tracer" - -#: pcbnew/pcbplot.cpp:232 -msgid "Plot Format" -msgstr "Format de tracé" - -#: pcbnew/pcbplot.cpp:243 -msgid "HPGL Options:" -msgstr "Options HPGL:" - -#: pcbnew/pcbplot.cpp:248 -msgid "Pen size" -msgstr "Diam plume" - -#: pcbnew/pcbplot.cpp:255 -msgid "Pen Speed (cm/s)" -msgstr "Vitesse Plume ( cm/s )" - -#: pcbnew/pcbplot.cpp:259 -msgid "Set pen speed in cm/s" -msgstr "Ajuster Vitesse plume en centimètres par seconde" - -#: pcbnew/pcbplot.cpp:261 -msgid "Pen ovr" -msgstr "Recouvrement" - -#: pcbnew/pcbplot.cpp:267 -msgid "Set plot overlay for filling" -msgstr "Ajuste recouvrement des tracés pour les remplissages" - -#: pcbnew/pcbplot.cpp:269 -msgid "Line width" -msgstr "Epaisseur ligne" - -#: pcbnew/pcbplot.cpp:276 -msgid "Set lines width used to plot in sketch mode and plot pads outlines on silk screen layers" -msgstr "Ajuste l'épaisseur des lignes utilisées pour tracer en mode contour et pour les contours des pads sur les couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:281 -msgid "Absolute" -msgstr "Absolu" - -#: pcbnew/pcbplot.cpp:281 -msgid "Auxiliary axis" -msgstr "Axe Auxiliaire" - -#: pcbnew/pcbplot.cpp:284 -msgid "Plot Origin" -msgstr "Origine des Coord de Tracé" - -#: pcbnew/pcbplot.cpp:309 -msgid "X scale adjust" -msgstr "Ajustage Echelle X" - -#: pcbnew/pcbplot.cpp:312 -msgid "Set X scale adjust for exact scale plotting" -msgstr "Ajuster échelle X pour traçage à l'échelle exacte" - -#: pcbnew/pcbplot.cpp:316 -msgid "Y scale adjust" -msgstr "Ajustage Echelle Y" - -#: pcbnew/pcbplot.cpp:319 -msgid "Set Y scale adjust for exact scale plotting" -msgstr "Ajuster échelle Y pour traçage à l'échelle exacte" - -#: pcbnew/pcbplot.cpp:322 -msgid "Plot negative" -msgstr "Tracé en Négatif" - -#: pcbnew/pcbplot.cpp:331 -msgid "Save Options" -msgstr "Sauver Options" - -#: pcbnew/pcbplot.cpp:335 -msgid "Generate drill file" -msgstr "Créer Fichier de perçage" - -#: pcbnew/pcbplot.cpp:338 -msgid "Close" -msgstr "Fermer" - -#: pcbnew/pcbplot.cpp:384 -msgid "Use Proper Gerber Extensions" -msgstr "Utiliser Extensions Gerber Particulières" - -#: pcbnew/pcbplot.cpp:390 -msgid "Use Proper Gerber Extensions - .GBL, .GTL, etc..." -msgstr "Utiliser les extensions GERBER specifiques aux couches - .GBL, .GTL, etc..." - -#: pcbnew/pcbplot.cpp:397 -msgid "Exclude pcb edge layer" -msgstr "Exclure couche contours PCB" - -#: pcbnew/pcbplot.cpp:401 -msgid "Exclude contents of the pcb edge layer from all other layers" -msgstr "Exclure les tracés contour PCB des autres couches" - -#: pcbnew/pcbplot.cpp:408 -msgid "Print sheet reference" -msgstr "Imprimer cartouche" - -#: pcbnew/pcbplot.cpp:419 -msgid "Print pads on silkscreen" -msgstr "Pads sur Sérigraphie" - -#: pcbnew/pcbplot.cpp:426 -msgid "Enable/disable print/plot pads on silkscreen layers" -msgstr "Active/désactive tracé des pastilles sur les couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:430 -msgid "Always print pads" -msgstr "Toujours tracer pads" - -#: pcbnew/pcbplot.cpp:435 -msgid "Force print/plot pads on ALL layers" -msgstr "Force le tracé des pastilles sur TOUTES les couches" - -#: pcbnew/pcbplot.cpp:440 -msgid "Print module value" -msgstr "Imprimer Valeur Module" - -#: pcbnew/pcbplot.cpp:444 -msgid "Enable/disable print/plot module value on silkscreen layers" -msgstr "Active/désactive le tracé des textes valeurs des modules sur couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:448 -msgid "Print module reference" -msgstr "Imprimer Référence Module" - -#: pcbnew/pcbplot.cpp:452 -msgid "Enable/disable print/plot module reference on silkscreen layers" -msgstr "Active/désactive le tracé des textes référence des modules sur couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:456 -msgid "Print other module texts" -msgstr "Imprimer autres textes module" - -#: pcbnew/pcbplot.cpp:460 -msgid "Enable/disable print/plot module field texts on silkscreen layers" -msgstr "Active/désactive le tracé des textes des champs des modules sur couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:465 -msgid "Force print invisible texts" -msgstr "Force tracé textes invisibles" - -#: pcbnew/pcbplot.cpp:469 -msgid "Force print/plot module invisible texts on silkscreen layers" -msgstr "Force le tracé des textes invisibles sur couches de sérigraphie" - -#: pcbnew/pcbplot.cpp:475 -msgid "No drill mark" -msgstr "Pas de marque" - -#: pcbnew/pcbplot.cpp:476 -msgid "Small mark" -msgstr "Petite marque" - -#: pcbnew/pcbplot.cpp:477 -msgid "Real drill" -msgstr "Perçage réel" - -#: pcbnew/pcbplot.cpp:481 -msgid "Pads Drill Opt" -msgstr "Options Perçage Pads" - -#: pcbnew/pcbplot.cpp:490 -msgid "Auto scale" -msgstr "Ech. auto" - -#: pcbnew/pcbplot.cpp:491 -msgid "Scale 1" -msgstr "Echelle 1" - -#: pcbnew/pcbplot.cpp:492 -msgid "Scale 1.5" -msgstr "Echelle 1,5" - -#: pcbnew/pcbplot.cpp:493 -msgid "Scale 2" -msgstr "Echelle 2" - -#: pcbnew/pcbplot.cpp:494 -msgid "Scale 3" -msgstr "Echelle 3" - -#: pcbnew/pcbplot.cpp:498 -msgid "Scale Opt" -msgstr "Echelle" - -#: pcbnew/pcbplot.cpp:507 -msgid "Line" -msgstr "Ligne" - -#: pcbnew/pcbplot.cpp:507 -msgid "Filled" -msgstr "Plein" - -#: pcbnew/pcbplot.cpp:508 -msgid "Sketch" -msgstr "Contour" - -#: pcbnew/pcbplot.cpp:511 -msgid "Plot Mode" -msgstr "Mode de Tracé" - -#: pcbnew/pcbplot.cpp:519 -msgid "Plot mirror" -msgstr "Tracé Miroir" - -#: pcbnew/pcbplot.cpp:525 -msgid "Vias on mask" -msgstr "Vias sur masque" - -#: pcbnew/pcbplot.cpp:529 -msgid "Print/plot vias on mask layers. They are in this case not protected" -msgstr "Trace vias sur vernis épargne. Elles seront non protégées" - -#: pcbnew/pcbplot.cpp:784 -msgid "Adobe post script files (.ps)|*.ps" -msgstr "Fichiers Adobe post script (.ps)|*.ps" - -#: pcbnew/pcbplot.cpp:790 -msgid "GERBER photo plot files (.pho .gbr)|*.pho;*.gbr" -msgstr "Fichiers photraçage GERBER (.pho .gbr)|*.pho;*.gbr" - -#: pcbnew/pcbplot.cpp:808 +#: pcbnew/pcbplot.cpp:583 msgid "Warning: Scale option set to a very small value" msgstr "Attention: option d'échelle ajustée à une valeur très petite" -#: pcbnew/pcbplot.cpp:811 +#: pcbnew/pcbplot.cpp:586 msgid "Warning: Scale option set to a very large value" msgstr "Attention: option d'échelle ajustée à une valeur très grande" -#: pcbnew/pcbplot.cpp:939 +#: pcbnew/pcbplot.cpp:715 +#, c-format +msgid "Plot file <%s> created" +msgstr "Fichier de tracé <%s> créé" + +#: pcbnew/pcbplot.cpp:727 msgid "No layer selected" msgstr "Pas de couche sélectionnée" @@ -2668,10 +2440,6 @@ msgstr "Pas de couche sélectionnée" msgid "Freeroute Help" msgstr "Aide Freeroute" -#: pcbnew/plotgerb.cpp:54 -msgid "unable to create file " -msgstr "Impossible de créer fichier " - #: pcbnew/swap_layers.cpp:68 msgid "Swap Layers:" msgstr "Permutte couches" @@ -2934,6 +2702,11 @@ msgstr "H, V et 45 deg" msgid "Zone Edges Orient" msgstr "Direction contours zone" +#: pcbnew/dialog_non_copper_zones_properties_base.cpp:54 +#: pcbnew/dialog_copper_zones_base.cpp:107 +msgid "Line" +msgstr "Ligne" + #: pcbnew/dialog_non_copper_zones_properties_base.cpp:54 msgid "Hatched Outline" msgstr "Contour Hachuré" @@ -4086,6 +3859,14 @@ msgstr "Echelle Précise 1" msgid "Scale 1.4" msgstr "Echelle 1,4" +#: pcbnew/dialog_print_using_printer_base.cpp:46 +msgid "Scale 2" +msgstr "Echelle 2" + +#: pcbnew/dialog_print_using_printer_base.cpp:46 +msgid "Scale 3" +msgstr "Echelle 3" + #: pcbnew/dialog_print_using_printer_base.cpp:46 msgid "Scale 4" msgstr "Echelle 4" @@ -4098,10 +3879,18 @@ msgstr "Echelle approx.:" msgid "X Scale Adjust" msgstr "Ajustage Echelle X" +#: pcbnew/dialog_print_using_printer_base.cpp:57 +msgid "Set X scale adjust for exact scale plotting" +msgstr "Ajuster échelle X pour traçage à l'échelle exacte" + #: pcbnew/dialog_print_using_printer_base.cpp:61 msgid "Y Scale Adjust" msgstr "Ajustage Echelle Y" +#: pcbnew/dialog_print_using_printer_base.cpp:66 +msgid "Set Y scale adjust for exact scale plotting" +msgstr "Ajuster échelle Y pour traçage à l'échelle exacte" + #: pcbnew/dialog_print_using_printer_base.cpp:78 msgid "Pen Width Mini" msgstr "Epaiss Plume Mini" @@ -4142,6 +3931,11 @@ msgstr "Prévisualisation" msgid "Print" msgstr "Imprimer" +#: pcbnew/dialog_print_using_printer_base.cpp:128 +#: pcbnew/dialog_netlist_fbp.cpp:85 +msgid "Close" +msgstr "Fermer" + #: pcbnew/dialog_netlist_fbp.cpp:25 msgid "Timestamp" msgstr "Timestamp" @@ -4848,19 +4642,19 @@ msgstr "" "Chemins (chemins système et chemins utilisateurs) utilisés pour chercher et charger les fichiers libriries et documentation des composants.\n" "Triés par ordre de priorité décroissante." -#: pcbnew/dialog_print_using_printer.cpp:90 +#: pcbnew/dialog_print_using_printer.cpp:91 msgid "Error Init Printer info" msgstr "Erreur Init info imprimante" -#: pcbnew/dialog_print_using_printer.cpp:372 +#: pcbnew/dialog_print_using_printer.cpp:384 msgid "Printer Problem!" msgstr "Problème d'imprimante" -#: pcbnew/dialog_print_using_printer.cpp:386 +#: pcbnew/dialog_print_using_printer.cpp:398 msgid "Print Preview" msgstr "Prévisualisation" -#: pcbnew/dialog_print_using_printer.cpp:453 +#: pcbnew/dialog_print_using_printer.cpp:465 msgid "There was a problem printing" msgstr "Il y a un problème d'impression" @@ -5177,19 +4971,19 @@ msgstr "Nom" msgid "Enabled" msgstr "Activé" -#: pcbnew/dialog_layers_setup.cpp:613 +#: pcbnew/dialog_layers_setup.cpp:614 msgid "Layer name may not be empty" msgstr "Le nom d'une couche ne peut pas être vide" -#: pcbnew/dialog_layers_setup.cpp:620 +#: pcbnew/dialog_layers_setup.cpp:621 msgid "Layer name has an illegal character, one of: '" msgstr "Le nom d'une couche contient un des caracteres interdit: '" -#: pcbnew/dialog_layers_setup.cpp:627 +#: pcbnew/dialog_layers_setup.cpp:628 msgid "'signal' is a reserved layer name" msgstr "'signal' is a nom de couche réservé" -#: pcbnew/dialog_layers_setup.cpp:636 +#: pcbnew/dialog_layers_setup.cpp:637 msgid "Layer name is a duplicate of another" msgstr "Le nom de la couche est un double d'une autre couche" @@ -6078,6 +5872,22 @@ msgstr "Ajuster Toutes les Pistes à la Valeur en NetClass" msgid "Tracks and vias:" msgstr "Pistes et vias:" +#: pcbnew/dialog_display_options_base.cpp:22 +#: pcbnew/dialog_display_options_base.cpp:67 +#: pcbnew/dialog_display_options_base.cpp:73 +#: pcbnew/dialog_display_options_base.cpp:84 +#: pcbnew/dialog_display_options_base.cpp:118 +msgid "Sketch" +msgstr "Contour" + +#: pcbnew/dialog_display_options_base.cpp:22 +#: pcbnew/dialog_display_options_base.cpp:67 +#: pcbnew/dialog_display_options_base.cpp:73 +#: pcbnew/dialog_display_options_base.cpp:84 +#: pcbnew/dialog_display_options_base.cpp:118 +msgid "Filled" +msgstr "Plein" + #: pcbnew/dialog_display_options_base.cpp:24 msgid "Tracks:" msgstr "Pistes:" @@ -6229,6 +6039,10 @@ msgstr "Long. Net" msgid "Print Footprint" msgstr "Imprimer Module" +#: pcbnew/dialog_print_for_modedit_base.cpp:22 +msgid "Scale 1" +msgstr "Echelle 1" + #: pcbnew/dialog_print_for_modedit_base.cpp:22 msgid "Scale 8" msgstr "Echelle 8" @@ -6546,6 +6360,202 @@ msgstr "Ajuster toutes vias (pas les pistes) à leurs valeurs en Netclass" msgid "Set all tracks (no via) to their Netclass value" msgstr "Ajuster toutes Pistes (pas les Vias) à leurs Valeurs en NetClass" +#: pcbnew/dialog_plot_base.cpp:38 +msgid "Use Proper Gerber Extensions" +msgstr "Utiliser Extensions Gerber Particulières" + +#: pcbnew/dialog_plot_base.cpp:40 +msgid "Use Proper Gerber Extensions - .GBL, .GTL, etc..." +msgstr "Utiliser les extensions GERBER specifiques aux couches - .GBL, .GTL, etc..." + +#: pcbnew/dialog_plot_base.cpp:44 +msgid "Exclude pcb edge layer" +msgstr "Exclure couche contours PCB" + +#: pcbnew/dialog_plot_base.cpp:46 +msgid "Exclude contents of the pcb edge layer from all other layers" +msgstr "Exclure les tracés contour PCB des autres couches" + +#: pcbnew/dialog_plot_base.cpp:50 +msgid "Print sheet reference" +msgstr "Imprimer cartouche" + +#: pcbnew/dialog_plot_base.cpp:54 +msgid "Print pads on silkscreen" +msgstr "Pads sur Sérigraphie" + +#: pcbnew/dialog_plot_base.cpp:56 +msgid "Enable/disable print/plot pads on silkscreen layers" +msgstr "Active/désactive tracé des pastilles sur les couches de sérigraphie" + +#: pcbnew/dialog_plot_base.cpp:60 +msgid "Always print pads" +msgstr "Toujours tracer pads" + +#: pcbnew/dialog_plot_base.cpp:62 +msgid "Force print/plot pads on ALL layers" +msgstr "Force le tracé des pastilles sur TOUTES les couches" + +#: pcbnew/dialog_plot_base.cpp:66 +msgid "Print module value" +msgstr "Imprimer Valeur Module" + +#: pcbnew/dialog_plot_base.cpp:70 +msgid "Print module reference" +msgstr "Imprimer Référence Module" + +#: pcbnew/dialog_plot_base.cpp:74 +msgid "Print other module texts" +msgstr "Imprimer autres textes module" + +#: pcbnew/dialog_plot_base.cpp:76 +msgid "Enable/disable print/plot module field texts on silkscreen layers" +msgstr "Active/désactive le tracé des textes des champs des modules sur couches de sérigraphie" + +#: pcbnew/dialog_plot_base.cpp:80 +msgid "Force print invisible texts" +msgstr "Force tracé textes invisibles" + +#: pcbnew/dialog_plot_base.cpp:82 +msgid "Force print/plot module invisible texts on silkscreen layers" +msgstr "Force le tracé des textes invisibles sur couches de sérigraphie" + +#: pcbnew/dialog_plot_base.cpp:91 +msgid "No drill mark" +msgstr "Pas de marque" + +#: pcbnew/dialog_plot_base.cpp:91 +msgid "Small mark" +msgstr "Petite marque" + +#: pcbnew/dialog_plot_base.cpp:91 +msgid "Real drill" +msgstr "Perçage réel" + +#: pcbnew/dialog_plot_base.cpp:93 +msgid "Pads Drill Opt" +msgstr "Options Perçage Pads" + +#: pcbnew/dialog_plot_base.cpp:97 +msgid "Auto scale" +msgstr "Ech. auto" + +#: pcbnew/dialog_plot_base.cpp:97 +msgid "Scale 1.5" +msgstr "Echelle 1,5" + +#: pcbnew/dialog_plot_base.cpp:99 +msgid "Scale Opt" +msgstr "Echelle" + +#: pcbnew/dialog_plot_base.cpp:105 +msgid "Plot Mode" +msgstr "Mode de Tracé" + +#: pcbnew/dialog_plot_base.cpp:109 +msgid "Absolute" +msgstr "Absolu" + +#: pcbnew/dialog_plot_base.cpp:109 +msgid "Auxiliary axis" +msgstr "Axe Auxiliaire" + +#: pcbnew/dialog_plot_base.cpp:111 +msgid "Plot Origin" +msgstr "Origine des Coord de Tracé" + +#: pcbnew/dialog_plot_base.cpp:120 +msgid "HPGL" +msgstr "HPGL" + +#: pcbnew/dialog_plot_base.cpp:120 +msgid "Gerber" +msgstr "Gerber" + +#: pcbnew/dialog_plot_base.cpp:120 +msgid "Postscript" +msgstr "Postscript" + +#: pcbnew/dialog_plot_base.cpp:120 +msgid "Postscript A4" +msgstr "Postscript A4" + +#: pcbnew/dialog_plot_base.cpp:120 +msgid "DXF Export" +msgstr "Export DXF" + +#: pcbnew/dialog_plot_base.cpp:122 +msgid "Plot Format" +msgstr "Format de tracé" + +#: pcbnew/dialog_plot_base.cpp:127 +msgid "HPGL Options:" +msgstr "Options HPGL:" + +#: pcbnew/dialog_plot_base.cpp:129 +msgid "Pen size" +msgstr "Diam plume" + +#: pcbnew/dialog_plot_base.cpp:136 +msgid "Pen Speed (cm/s)" +msgstr "Vitesse Plume ( cm/s )" + +#: pcbnew/dialog_plot_base.cpp:141 +msgid "Set pen speed in cm/s" +msgstr "Ajuster Vitesse plume en centimètres par seconde" + +#: pcbnew/dialog_plot_base.cpp:145 +msgid "Pen ovr" +msgstr "Recouvrement" + +#: pcbnew/dialog_plot_base.cpp:150 +msgid "Set plot overlay for filling" +msgstr "Ajuste recouvrement des tracés pour les remplissages" + +#: pcbnew/dialog_plot_base.cpp:157 +msgid "PS Options:" +msgstr "Options PS:" + +#: pcbnew/dialog_plot_base.cpp:159 +msgid "Plot negative" +msgstr "Tracé en Négatif" + +#: pcbnew/dialog_plot_base.cpp:170 +msgid "Plot mirror" +msgstr "Tracé Miroir" + +#: pcbnew/dialog_plot_base.cpp:174 +msgid "Vias on mask" +msgstr "Vias sur masque" + +#: pcbnew/dialog_plot_base.cpp:176 +msgid "Print/plot vias on mask layers. They are in this case not protected" +msgstr "Trace vias sur vernis épargne. Elles seront non protégées" + +#: pcbnew/dialog_plot_base.cpp:180 +msgid "Line width" +msgstr "Epaisseur ligne" + +#: pcbnew/dialog_plot_base.cpp:190 +msgid "X scale adjust" +msgstr "Ajustage Echelle X" + +#: pcbnew/dialog_plot_base.cpp:199 +msgid "Y scale adjust" +msgstr "Ajustage Echelle Y" + +#: pcbnew/dialog_plot_base.cpp:209 +msgid "Plot" +msgstr "Tracer" + +#: pcbnew/dialog_plot_base.cpp:213 +msgid "Save Options" +msgstr "Sauver Options" + +#: pcbnew/dialog_plot_base.cpp:216 +msgid "Generate drill file" +msgstr "Créer Fichier de perçage" + #: pcbnew/toolbars_update_user_interface.cpp:39 msgid " mils" msgstr " mils" @@ -7552,6 +7562,7 @@ msgid "&New" msgstr "&Nouveau" #: eeschema/menubar.cpp:43 +#: eeschema/tool_sch.cpp:34 msgid "New schematic project" msgstr "Nouveau Projet schématique" @@ -7696,6 +7707,7 @@ msgid "W&ire to bus entry" msgstr "Entrées de bus (type fil vers bus)" #: eeschema/menubar.cpp:215 +#: eeschema/tool_sch.cpp:179 msgid "Place a wire to bus entry" msgstr "Placer une Entrée de Bus (type fil vers bus)" @@ -7704,6 +7716,7 @@ msgid "B&us to bus entry" msgstr "Entrées de bus (type bus vers bus)" #: eeschema/menubar.cpp:221 +#: eeschema/tool_sch.cpp:183 msgid "Place a bus to bus entry" msgstr "Placer une Entrée de Bus (type bus vers bus)" @@ -7720,6 +7733,7 @@ msgid "Net name" msgstr "Net Name" #: eeschema/menubar.cpp:231 +#: eeschema/tool_sch.cpp:192 msgid "Place net name" msgstr "Place nom de net" @@ -7744,6 +7758,7 @@ msgid "Hierarchical label" msgstr "Label Hiérarchique" #: eeschema/menubar.cpp:250 +#: eeschema/tool_sch.cpp:206 msgid "Place a hierarchical label. This label will be seen as a pin sheet in the sheet symbol" msgstr "Placer un label hiérachique. Ce label sera vu comme une pin dans la feuille mère symbole" @@ -7784,6 +7799,7 @@ msgid "Graphic text (comment)" msgstr "Textes graphiques (commentaires)" #: eeschema/menubar.cpp:286 +#: eeschema/tool_sch.cpp:229 msgid "Place graphic text (comment)" msgstr "Placer textes graphiques (commentaires)" @@ -11368,14 +11384,14 @@ msgid "%d errors while reading Gerber file [%s]" msgstr "%d erreurs pendant lecture fichier gerber [%s]" #: gerbview/readgerb.cpp:267 -#: gerbview/files.cpp:185 -#: gerbview/files.cpp:218 +#: gerbview/files.cpp:188 +#: gerbview/files.cpp:221 #, c-format msgid "Gerber DCODE files (%s)|*.%s" msgstr "Fichiers Gerber DCODE (%s)|*.%s" #: gerbview/readgerb.cpp:272 -#: gerbview/files.cpp:191 +#: gerbview/files.cpp:194 msgid "Load GERBER DCODE File" msgstr "Charger Fichier de DCodes" @@ -11391,63 +11407,63 @@ msgstr "Gerbview est en cours d'exécution. Continuer ?" msgid "Not yet available..." msgstr "non encore disponible" -#: gerbview/files.cpp:114 +#: gerbview/files.cpp:117 msgid "Gerber files (.gb* .gt* .lgr .ger .pho)" msgstr "Fichiers Gerber .gb* .gt* .lgr .ger .pho)" -#: gerbview/files.cpp:120 +#: gerbview/files.cpp:123 msgid "Top layer (*.GTL)|*.GTL;*.gtl|" msgstr "Couche composant" -#: gerbview/files.cpp:121 +#: gerbview/files.cpp:124 msgid "Bottom layer (*.GBL)|*.GBL;*.gbl|" msgstr "Couche cuivre" -#: gerbview/files.cpp:122 +#: gerbview/files.cpp:125 msgid "Bottom solder resist (*.GBS)|*.GBS;*.gbs|" msgstr "Masque soudure cuivre (*.GBS)|*.GBS;*.gbs|" -#: gerbview/files.cpp:123 +#: gerbview/files.cpp:126 msgid "Top solder resist (*.GTS)|*.GTS;*.gts|" msgstr "Masque soudure composant (*.GTS)|*.GTS;*.gts|" -#: gerbview/files.cpp:124 +#: gerbview/files.cpp:127 msgid "Bottom overlay (*.GBO)|*.GBO;*.gbo|" msgstr "Bottom overlay (*.GBO)|*.GBO;*.gbo|" -#: gerbview/files.cpp:125 +#: gerbview/files.cpp:128 msgid "Top overlay (*.GTO)|*.GTO;*.gto|" msgstr "Top overlay (*.GTO)|*.GTO;*.gto|" -#: gerbview/files.cpp:126 +#: gerbview/files.cpp:129 msgid "Bottom paste (*.GBP)|*.GBP;*.gbp|" msgstr "Masque pate à souder cuivre (*.GBP)|*.GBP;*.gbp|" -#: gerbview/files.cpp:127 +#: gerbview/files.cpp:130 msgid "Top paste (*.GTP)|*.GTP;*.gtp|" msgstr "Masque pate à souder composant (*.GTP)|*.GTP;*.gtp|" -#: gerbview/files.cpp:128 +#: gerbview/files.cpp:131 msgid "Keep-out layer (*.GKO)|*.GKO;*.gko|" msgstr "Couche de \"Keep-out\" (*.GKO)|*.GKO;*.gko|" -#: gerbview/files.cpp:129 +#: gerbview/files.cpp:132 msgid "Mechanical layers (*.GMx)|*.GM1;*.gm1;*.GM2;*.gm2;*.GM3;*.gm3|" msgstr "Couches mécaniques (*.GMx)|*.GM1;*.gm1;*.GM2;*.gm2;*.GM3;*.gm3|" -#: gerbview/files.cpp:130 +#: gerbview/files.cpp:133 msgid "Top Pad Master (*.GPT)|*.GPT;*.gpt|" msgstr "Top Pad Master (*.GPT)|*.GPT;*.gpt|" -#: gerbview/files.cpp:131 +#: gerbview/files.cpp:134 msgid "Bottom Pad Master (*.GPB)|*.GPB;*.gpb|" msgstr "Bottom Pad Master (*.GPB)|*.GPB;*.gpb|" -#: gerbview/files.cpp:141 +#: gerbview/files.cpp:144 msgid "Open Gerber File" msgstr "Ouvrir Fichier Gerber" -#: gerbview/files.cpp:222 +#: gerbview/files.cpp:225 msgid "Save Gerber File" msgstr "Sauver Fichier Gerber" @@ -12850,6 +12866,28 @@ msgstr "Options d'Affichage" msgid "Page Settings" msgstr "Ajustage opt Page" +#~ msgid "File" +#~ msgstr "Fichier" +#~ msgid "" +#~ "Set lines width used to plot in sketch mode and plot pads outlines on " +#~ "silk screen layers" +#~ msgstr "" +#~ "Ajuste l'épaisseur des lignes utilisées pour tracer en mode contour et " +#~ "pour les contours des pads sur les couches de sérigraphie" +#~ msgid "Enable/disable print/plot module value on silkscreen layers" +#~ msgstr "" +#~ "Active/désactive le tracé des textes valeurs des modules sur couches de " +#~ "sérigraphie" +#~ msgid "Enable/disable print/plot module reference on silkscreen layers" +#~ msgstr "" +#~ "Active/désactive le tracé des textes référence des modules sur couches de " +#~ "sérigraphie" +#~ msgid "Adobe post script files (.ps)|*.ps" +#~ msgstr "Fichiers Adobe post script (.ps)|*.ps" +#~ msgid "GERBER photo plot files (.pho .gbr)|*.pho;*.gbr" +#~ msgstr "Fichiers photraçage GERBER (.pho .gbr)|*.pho;*.gbr" +#~ msgid "unable to create file " +#~ msgstr "Impossible de créer fichier " #~ msgid "" #~ "Gerber files (.gbr .gbx .lgr .ger .pho)| .gbr;*.GBR;*.gbx;*.GBX;*.lgr;*." #~ "LGR;*.ger;*.GER;*.pho;*.PHO|" diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 14e2a98d41..ef612f405f 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -65,8 +65,10 @@ set(PCBNEW_SRCS dialog_pcbnew_config_libs_and_paths.cpp dialog_pcbnew_config_libs_and_paths_fbp.cpp dialog_print_for_modedit.cpp + dialog_plot_base.cpp dialog_print_for_modedit_base.cpp dialog_print_using_printer.cpp + dialog_print_using_printer_base.cpp dialog_orient_footprints.cpp dialog_mask_clearance.cpp dialog_mask_clearance_base.cpp diff --git a/pcbnew/dialog_layers_setup.cpp b/pcbnew/dialog_layers_setup.cpp index 955273890a..b18279b50d 100644 --- a/pcbnew/dialog_layers_setup.cpp +++ b/pcbnew/dialog_layers_setup.cpp @@ -545,6 +545,7 @@ void DIALOG_LAYERS_SETUP::OnOkButtonClick( wxCommandEvent& event ) } } + m_Parent->GetScreen()->SetModify(); m_Parent->ReCreateLayerBox( NULL ); EndModal( wxID_OK ); diff --git a/pcbnew/dialog_plot_base.cpp b/pcbnew/dialog_plot_base.cpp new file mode 100644 index 0000000000..04ec4cc37e --- /dev/null +++ b/pcbnew/dialog_plot_base.cpp @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_plot_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,350 ), wxDefaultSize ); + + wxBoxSizer* bMainSizer; + bMainSizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bUpperSizer; + bUpperSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bLeftSizer; + bLeftSizer = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbLayersSizer; + sbLayersSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Layers:") ), wxHORIZONTAL ); + + m_CopperLayersBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Copper Layers:") ), wxVERTICAL ); + + sbLayersSizer->Add( m_CopperLayersBoxSizer, 1, wxALL, 5 ); + + m_TechnicalLayersBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Technical Layers:") ), wxVERTICAL ); + + sbLayersSizer->Add( m_TechnicalLayersBoxSizer, 1, wxALL, 5 ); + + bLeftSizer->Add( sbLayersSizer, 1, wxEXPAND, 5 ); + + m_Use_Gerber_Extensions = new wxCheckBox( this, ID_USE_GERBER_EXTENSIONS, _("Use Proper Gerber Extensions"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Use_Gerber_Extensions->SetToolTip( _("Use Proper Gerber Extensions - .GBL, .GTL, etc...") ); + + bLeftSizer->Add( m_Use_Gerber_Extensions, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Exclude_Edges_Pcb = new wxCheckBox( this, wxID_ANY, _("Exclude pcb edge layer"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Exclude_Edges_Pcb->SetToolTip( _("Exclude contents of the pcb edge layer from all other layers") ); + + bLeftSizer->Add( m_Exclude_Edges_Pcb, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Sheet_Ref = new wxCheckBox( this, wxID_ANY, _("Print sheet reference"), wxDefaultPosition, wxDefaultSize, 0 ); + + bLeftSizer->Add( m_Plot_Sheet_Ref, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Pads_on_Silkscreen = new wxCheckBox( this, ID_PRINT_PAD_ON_SILKSCREEN, _("Print pads on silkscreen"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Plot_Pads_on_Silkscreen->SetToolTip( _("Enable/disable print/plot pads on silkscreen layers") ); + + bLeftSizer->Add( m_Plot_Pads_on_Silkscreen, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Force_Plot_Pads = new wxCheckBox( this, ID_FORCE_PRINT_PAD, _("Always print pads"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Force_Plot_Pads->SetToolTip( _("Force print/plot pads on ALL layers") ); + + bLeftSizer->Add( m_Force_Plot_Pads, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Text_Value = new wxCheckBox( this, ID_PRINT_VALUE, _("Print module value"), wxDefaultPosition, wxDefaultSize, 0 ); + + bLeftSizer->Add( m_Plot_Text_Value, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Text_Ref = new wxCheckBox( this, ID_PRINT_REF, _("Print module reference"), wxDefaultPosition, wxDefaultSize, 0 ); + + bLeftSizer->Add( m_Plot_Text_Ref, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Text_Div = new wxCheckBox( this, ID_PRINT_MODULE_TEXTS, _("Print other module texts"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Plot_Text_Div->SetToolTip( _("Enable/disable print/plot module field texts on silkscreen layers") ); + + bLeftSizer->Add( m_Plot_Text_Div, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Plot_Invisible_Text = new wxCheckBox( this, ID_FORCE_PRINT_INVISIBLE_TEXT, _("Force print invisible texts"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_Plot_Invisible_Text->SetToolTip( _("Force print/plot module invisible texts on silkscreen layers") ); + + bLeftSizer->Add( m_Plot_Invisible_Text, 0, wxALL, 5 ); + + bUpperSizer->Add( bLeftSizer, 1, wxEXPAND, 5 ); + + wxBoxSizer* bPlotOptionsSizer; + bPlotOptionsSizer = new wxBoxSizer( wxVERTICAL ); + + wxString m_Drill_Shape_OptChoices[] = { _("No drill mark"), _("Small mark"), _("Real drill") }; + int m_Drill_Shape_OptNChoices = sizeof( m_Drill_Shape_OptChoices ) / sizeof( wxString ); + m_Drill_Shape_Opt = new wxRadioBox( this, ID_DRILL_SHAPE_OPT, _("Pads Drill Opt"), wxDefaultPosition, wxDefaultSize, m_Drill_Shape_OptNChoices, m_Drill_Shape_OptChoices, 1, wxRA_SPECIFY_COLS ); + m_Drill_Shape_Opt->SetSelection( 1 ); + bPlotOptionsSizer->Add( m_Drill_Shape_Opt, 0, wxALL|wxEXPAND, 5 ); + + wxString m_Scale_OptChoices[] = { _("Auto scale"), _("Scale 1"), _("Scale 1.5"), _("Scale 2"), _("Scale 3") }; + int m_Scale_OptNChoices = sizeof( m_Scale_OptChoices ) / sizeof( wxString ); + m_Scale_Opt = new wxRadioBox( this, wxID_ANY, _("Scale Opt"), wxDefaultPosition, wxDefaultSize, m_Scale_OptNChoices, m_Scale_OptChoices, 1, wxRA_SPECIFY_COLS ); + m_Scale_Opt->SetSelection( 0 ); + bPlotOptionsSizer->Add( m_Scale_Opt, 0, wxALL|wxEXPAND, 5 ); + + wxString m_PlotModeOptChoices[] = { _("Line"), _("Filled"), _("Sketch") }; + int m_PlotModeOptNChoices = sizeof( m_PlotModeOptChoices ) / sizeof( wxString ); + m_PlotModeOpt = new wxRadioBox( this, wxID_ANY, _("Plot Mode"), wxDefaultPosition, wxDefaultSize, m_PlotModeOptNChoices, m_PlotModeOptChoices, 1, wxRA_SPECIFY_COLS ); + m_PlotModeOpt->SetSelection( 0 ); + bPlotOptionsSizer->Add( m_PlotModeOpt, 0, wxALL|wxEXPAND, 5 ); + + wxString m_Choice_Plot_OffsetChoices[] = { _("Absolute"), _("Auxiliary axis") }; + int m_Choice_Plot_OffsetNChoices = sizeof( m_Choice_Plot_OffsetChoices ) / sizeof( wxString ); + m_Choice_Plot_Offset = new wxRadioBox( this, wxID_ANY, _("Plot Origin"), wxDefaultPosition, wxDefaultSize, m_Choice_Plot_OffsetNChoices, m_Choice_Plot_OffsetChoices, 1, wxRA_SPECIFY_COLS ); + m_Choice_Plot_Offset->SetSelection( 0 ); + bPlotOptionsSizer->Add( m_Choice_Plot_Offset, 0, wxALL|wxEXPAND, 5 ); + + bUpperSizer->Add( bPlotOptionsSizer, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerFmtPlot; + bSizerFmtPlot = new wxBoxSizer( wxVERTICAL ); + + wxString m_PlotFormatOptChoices[] = { _("HPGL"), _("Gerber"), _("Postscript"), _("Postscript A4"), _("DXF Export") }; + int m_PlotFormatOptNChoices = sizeof( m_PlotFormatOptChoices ) / sizeof( wxString ); + m_PlotFormatOpt = new wxRadioBox( this, wxID_ANY, _("Plot Format"), wxDefaultPosition, wxDefaultSize, m_PlotFormatOptNChoices, m_PlotFormatOptChoices, 1, wxRA_SPECIFY_COLS ); + m_PlotFormatOpt->SetSelection( 1 ); + bSizerFmtPlot->Add( m_PlotFormatOpt, 0, wxALL|wxEXPAND, 5 ); + + wxStaticBoxSizer* m_HPGL_OptionsBox; + m_HPGL_OptionsBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("HPGL Options:") ), wxVERTICAL ); + + m_textPenSize = new wxStaticText( this, wxID_ANY, _("Pen size"), wxDefaultPosition, wxDefaultSize, 0 ); + m_textPenSize->Wrap( -1 ); + m_HPGL_OptionsBox->Add( m_textPenSize, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_HPGLPenSizeOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_HPGL_OptionsBox->Add( m_HPGLPenSizeOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticText3 = new wxStaticText( this, wxID_ANY, _("Pen Speed (cm/s)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText3->Wrap( -1 ); + m_HPGL_OptionsBox->Add( m_staticText3, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_HPGLPenSpeedOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_HPGLPenSpeedOpt->SetToolTip( _("Set pen speed in cm/s") ); + + m_HPGL_OptionsBox->Add( m_HPGLPenSpeedOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_textPenOvr = new wxStaticText( this, wxID_ANY, _("Pen ovr"), wxDefaultPosition, wxDefaultSize, 0 ); + m_textPenOvr->Wrap( -1 ); + m_HPGL_OptionsBox->Add( m_textPenOvr, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_HPGLPenOverlayOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_HPGLPenOverlayOpt->SetToolTip( _("Set plot overlay for filling") ); + + m_HPGL_OptionsBox->Add( m_HPGLPenOverlayOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + bSizerFmtPlot->Add( m_HPGL_OptionsBox, 0, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizerPSOpt; + sbSizerPSOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("PS Options:") ), wxVERTICAL ); + + m_Plot_PS_Negative = new wxCheckBox( this, wxID_ANY, _("Plot negative"), wxDefaultPosition, wxDefaultSize, 0 ); + + sbSizerPSOpt->Add( m_Plot_PS_Negative, 0, wxALL, 5 ); + + bSizerFmtPlot->Add( sbSizerPSOpt, 0, wxEXPAND, 5 ); + + bUpperSizer->Add( bSizerFmtPlot, 1, wxEXPAND, 5 ); + + wxBoxSizer* bButtonsSizer; + bButtonsSizer = new wxBoxSizer( wxVERTICAL ); + + m_PlotMirorOpt = new wxCheckBox( this, ID_MIROR_OPT, _("Plot mirror"), wxDefaultPosition, wxDefaultSize, 0 ); + + bButtonsSizer->Add( m_PlotMirorOpt, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_PlotNoViaOnMaskOpt = new wxCheckBox( this, ID_MASKVIA_OPT, _("Vias on mask"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_PlotNoViaOnMaskOpt->SetToolTip( _("Print/plot vias on mask layers. They are in this case not protected") ); + + bButtonsSizer->Add( m_PlotNoViaOnMaskOpt, 0, wxALL, 5 ); + + m_staticText6 = new wxStaticText( this, wxID_ANY, _("Line width"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText6->Wrap( -1 ); + bButtonsSizer->Add( m_staticText6, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_LinesWidth = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_LinesWidth, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bButtonsSizer->Add( 0, 20, 1, wxEXPAND, 5 ); + + m_staticText7 = new wxStaticText( this, wxID_ANY, _("X scale adjust"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText7->Wrap( -1 ); + bButtonsSizer->Add( m_staticText7, 0, wxRIGHT|wxLEFT, 5 ); + + m_FineAdjustXscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_FineAdjustXscaleOpt->SetToolTip( _("Set X scale adjust for exact scale plotting") ); + + bButtonsSizer->Add( m_FineAdjustXscaleOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticText8 = new wxStaticText( this, wxID_ANY, _("Y scale adjust"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8->Wrap( -1 ); + bButtonsSizer->Add( m_staticText8, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_FineAdjustYscaleOpt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_FineAdjustYscaleOpt, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bButtonsSizer->Add( 0, 20, 1, wxEXPAND, 5 ); + + m_PlotButton = new wxButton( this, ID_EXEC_PLOT, _("Plot"), wxDefaultPosition, wxDefaultSize, 0 ); + m_PlotButton->SetDefault(); + bButtonsSizer->Add( m_PlotButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_buttonSaveOpt = new wxButton( this, ID_SAVE_OPT_PLOT, _("Save Options"), wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_buttonSaveOpt, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_buttonDrill = new wxButton( this, ID_CREATE_DRILL_FILE, _("Generate drill file"), wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_buttonDrill, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Quit"), wxDefaultPosition, wxDefaultSize, 0 ); + bButtonsSizer->Add( m_buttonQuit, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bUpperSizer->Add( bButtonsSizer, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bMainSizer->Add( bUpperSizer, 0, wxEXPAND, 5 ); + + m_staticText2 = new wxStaticText( this, wxID_ANY, _("Messages:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText2->Wrap( -1 ); + bMainSizer->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_MessagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + m_MessagesBox->SetMinSize( wxSize( -1,120 ) ); + + bMainSizer->Add( m_MessagesBox, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + this->SetSizer( bMainSizer ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PLOT_BASE::OnCloseWindow ) ); + this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) ); + m_PlotFormatOpt->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::SetPlotFormat ), NULL, this ); + m_PlotButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::Plot ), NULL, this ); + m_buttonSaveOpt->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::SaveOptPlot ), NULL, this ); + m_buttonDrill->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::CreateDrillFile ), NULL, this ); + m_buttonQuit->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnQuit ), NULL, this ); +} + +DIALOG_PLOT_BASE::~DIALOG_PLOT_BASE() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PLOT_BASE::OnCloseWindow ) ); + this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) ); + m_PlotFormatOpt->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::SetPlotFormat ), NULL, this ); + m_PlotButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::Plot ), NULL, this ); + m_buttonSaveOpt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::SaveOptPlot ), NULL, this ); + m_buttonDrill->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::CreateDrillFile ), NULL, this ); + m_buttonQuit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnQuit ), NULL, this ); +} diff --git a/pcbnew/dialog_plot_base.fbp b/pcbnew/dialog_plot_base.fbp new file mode 100644 index 0000000000..cdad23d982 --- /dev/null +++ b/pcbnew/dialog_plot_base.fbp @@ -0,0 +1,2070 @@ + + + + + + C++ + 1 + UTF-8 + connect + dialog_plot_base + 1000 + none + 1 + Dialog_Plot_base + + . + + 1 + 1 + 0 + + + + + 1 + + + + 0 + wxID_ANY + + -1,350 + DIALOG_PLOT_BASE + + 575,590 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Plot + + + + + + + + OnCloseWindow + + + + + + OnInitDialog + + + + + + + + + + + + + + + + + + + + + + + bMainSizer + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bUpperSizer + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bLeftSizer + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + wxID_ANY + Layers: + + sbLayersSizer + wxHORIZONTAL + none + + + 5 + wxALL + 1 + + wxID_ANY + Copper Layers: + + m_CopperLayersBoxSizer + wxVERTICAL + protected + + + + + 5 + wxALL + 1 + + wxID_ANY + Technical Layers: + + m_TechnicalLayersBoxSizer + wxVERTICAL + protected + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_USE_GERBER_EXTENSIONS + Use Proper Gerber Extensions + + + m_Use_Gerber_Extensions + protected + + + + + Use Proper Gerber Extensions - .GBL, .GTL, etc... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Exclude pcb edge layer + + + m_Exclude_Edges_Pcb + protected + + + + + Exclude contents of the pcb edge layer from all other layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Print sheet reference + + + m_Plot_Sheet_Ref + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_PRINT_PAD_ON_SILKSCREEN + Print pads on silkscreen + + + m_Plot_Pads_on_Silkscreen + protected + + + + + Enable/disable print/plot pads on silkscreen layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_FORCE_PRINT_PAD + Always print pads + + + m_Force_Plot_Pads + protected + + + + + Force print/plot pads on ALL layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_PRINT_VALUE + Print module value + + + m_Plot_Text_Value + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_PRINT_REF + Print module reference + + + m_Plot_Text_Ref + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_PRINT_MODULE_TEXTS + Print other module texts + + + m_Plot_Text_Div + protected + + + + + Enable/disable print/plot module field texts on silkscreen layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + ID_FORCE_PRINT_INVISIBLE_TEXT + Force print invisible texts + + + m_Plot_Invisible_Text + protected + + + + + Force print/plot module invisible texts on silkscreen layers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bPlotOptionsSizer + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 0 + + + "No drill mark" "Small mark" "Real drill" + + 1 + + + 0 + ID_DRILL_SHAPE_OPT + Pads Drill Opt + 1 + + + m_Drill_Shape_Opt + protected + + 1 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Auto scale" "Scale 1" "Scale 1.5" "Scale 2" "Scale 3" + + 1 + + + 0 + wxID_ANY + Scale Opt + 1 + + + m_Scale_Opt + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Line" "Filled" "Sketch" + + 1 + + + 0 + wxID_ANY + Plot Mode + 1 + + + m_PlotModeOpt + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Absolute" "Auxiliary axis" + + 1 + + + 0 + wxID_ANY + Plot Origin + 1 + + + m_Choice_Plot_Offset + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerFmtPlot + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 0 + + + "HPGL" "Gerber" "Postscript" "Postscript A4" "DXF Export" + + 1 + + + 0 + wxID_ANY + Plot Format + 1 + + + m_PlotFormatOpt + protected + + 1 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + SetPlotFormat + + + + + + + + + + 5 + wxEXPAND + 0 + + wxID_ANY + HPGL Options: + + m_HPGL_OptionsBox + wxVERTICAL + none + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Pen size + + + m_textPenSize + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_HPGLPenSizeOpt + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Pen Speed (cm/s) + + + m_staticText3 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_HPGLPenSpeedOpt + protected + + + + + Set pen speed in cm/s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Pen ovr + + + m_textPenOvr + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_HPGLPenOverlayOpt + protected + + + + + Set plot overlay for filling + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + wxID_ANY + PS Options: + + sbSizerPSOpt + wxVERTICAL + none + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Plot negative + + + m_Plot_PS_Negative + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxEXPAND + 0 + + + bButtonsSizer + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + 0 + + 1 + + + 0 + ID_MIROR_OPT + Plot mirror + + + m_PlotMirorOpt + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + ID_MASKVIA_OPT + Vias on mask + + + m_PlotNoViaOnMaskOpt + protected + + + + + Print/plot vias on mask layers. They are in this case not protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Line width + + + m_staticText6 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_LinesWidth + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 20 + protected + 0 + + + + 5 + wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + X scale adjust + + + m_staticText7 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_FineAdjustXscaleOpt + protected + + + + + Set X scale adjust for exact scale plotting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Y scale adjust + + + m_staticText8 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_FineAdjustYscaleOpt + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 20 + protected + 0 + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND + 0 + + + + 1 + 1 + + + 0 + ID_EXEC_PLOT + Plot + + + m_PlotButton + protected + + + + + + + + + Plot + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND + 0 + + + + 0 + 1 + + + 0 + ID_SAVE_OPT_PLOT + Save Options + + + m_buttonSaveOpt + protected + + + + + + + + + SaveOptPlot + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND + 0 + + + + 0 + 1 + + + 0 + ID_CREATE_DRILL_FILE + Generate drill file + + + m_buttonDrill + protected + + + + + + + + + CreateDrillFile + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND + 0 + + + + 0 + 1 + + + 0 + wxID_CANCEL + Quit + + + m_buttonQuit + protected + + + + + + + + + OnQuit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Messages: + + + m_staticText2 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + -1,120 + m_MessagesBox + protected + + + wxTE_MULTILINE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialog_plot_base.h b/pcbnew/dialog_plot_base.h new file mode 100644 index 0000000000..ddab272df1 --- /dev/null +++ b/pcbnew/dialog_plot_base.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __dialog_plot_base__ +#define __dialog_plot_base__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_PLOT_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_PLOT_BASE : public wxDialog +{ + private: + + protected: + enum + { + ID_USE_GERBER_EXTENSIONS = 1000, + ID_PRINT_PAD_ON_SILKSCREEN, + ID_FORCE_PRINT_PAD, + ID_PRINT_VALUE, + ID_PRINT_REF, + ID_PRINT_MODULE_TEXTS, + ID_FORCE_PRINT_INVISIBLE_TEXT, + ID_DRILL_SHAPE_OPT, + ID_MIROR_OPT, + ID_MASKVIA_OPT, + ID_EXEC_PLOT, + ID_SAVE_OPT_PLOT, + ID_CREATE_DRILL_FILE, + }; + + wxStaticBoxSizer* m_CopperLayersBoxSizer; + wxStaticBoxSizer* m_TechnicalLayersBoxSizer; + wxCheckBox* m_Use_Gerber_Extensions; + wxCheckBox* m_Exclude_Edges_Pcb; + wxCheckBox* m_Plot_Sheet_Ref; + wxCheckBox* m_Plot_Pads_on_Silkscreen; + wxCheckBox* m_Force_Plot_Pads; + wxCheckBox* m_Plot_Text_Value; + wxCheckBox* m_Plot_Text_Ref; + wxCheckBox* m_Plot_Text_Div; + wxCheckBox* m_Plot_Invisible_Text; + wxRadioBox* m_Drill_Shape_Opt; + wxRadioBox* m_Scale_Opt; + wxRadioBox* m_PlotModeOpt; + wxRadioBox* m_Choice_Plot_Offset; + wxRadioBox* m_PlotFormatOpt; + wxStaticText* m_textPenSize; + wxTextCtrl* m_HPGLPenSizeOpt; + wxStaticText* m_staticText3; + wxTextCtrl* m_HPGLPenSpeedOpt; + wxStaticText* m_textPenOvr; + wxTextCtrl* m_HPGLPenOverlayOpt; + wxCheckBox* m_Plot_PS_Negative; + wxCheckBox* m_PlotMirorOpt; + wxCheckBox* m_PlotNoViaOnMaskOpt; + wxStaticText* m_staticText6; + wxTextCtrl* m_LinesWidth; + + wxStaticText* m_staticText7; + wxTextCtrl* m_FineAdjustXscaleOpt; + wxStaticText* m_staticText8; + wxTextCtrl* m_FineAdjustYscaleOpt; + + wxButton* m_PlotButton; + wxButton* m_buttonSaveOpt; + wxButton* m_buttonDrill; + wxButton* m_buttonQuit; + wxStaticText* m_staticText2; + wxTextCtrl* m_MessagesBox; + + // Virtual event handlers, overide them in your derived class + virtual void OnCloseWindow( wxCloseEvent& event ){ event.Skip(); } + virtual void OnInitDialog( wxInitDialogEvent& event ){ event.Skip(); } + virtual void SetPlotFormat( wxCommandEvent& event ){ event.Skip(); } + virtual void Plot( wxCommandEvent& event ){ event.Skip(); } + virtual void SaveOptPlot( wxCommandEvent& event ){ event.Skip(); } + virtual void CreateDrillFile( wxCommandEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + + + public: + DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Plot"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 575,590 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_PLOT_BASE(); + +}; + +#endif //__dialog_plot_base__ diff --git a/pcbnew/dialog_print_using_printer.cpp b/pcbnew/dialog_print_using_printer.cpp index 7652e34e78..5d3da85fe2 100644 --- a/pcbnew/dialog_print_using_printer.cpp +++ b/pcbnew/dialog_print_using_printer.cpp @@ -15,7 +15,9 @@ #include "printout_controler.h" #include "pcbnew.h" +#include "wxPcbStruct.h" #include "pcbplot.h" +#include "class_board_design_settings.h" #define WIDTH_MAX_VALUE 1000 #define WIDTH_MIN_VALUE 1 @@ -41,13 +43,13 @@ static PRINT_PARAMETERS s_Parameters; class DIALOG_PRINT_USING_PRINTER : public DIALOG_PRINT_USING_PRINTER_base { private: - WinEDA_DrawFrame* m_Parent; + WinEDA_PcbFrame* m_Parent; wxConfig* m_Config; wxCheckBox* m_BoxSelectLayer[32]; static bool m_ExcludeEdgeLayer; public: - DIALOG_PRINT_USING_PRINTER( WinEDA_DrawFrame* parent ); + DIALOG_PRINT_USING_PRINTER( WinEDA_PcbFrame* parent ); ~DIALOG_PRINT_USING_PRINTER() {}; private: @@ -74,7 +76,7 @@ bool DIALOG_PRINT_USING_PRINTER::m_ExcludeEdgeLayer; /*******************************************************/ -void WinEDA_DrawFrame::ToPrinter( wxCommandEvent& event ) +void WinEDA_PcbFrame::ToPrinter( wxCommandEvent& event ) /*******************************************************/ /* Virtual function: @@ -100,13 +102,13 @@ void WinEDA_DrawFrame::ToPrinter( wxCommandEvent& event ) /*************************************************************************************/ -DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( WinEDA_DrawFrame* parent ) : +DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( WinEDA_PcbFrame* parent ) : DIALOG_PRINT_USING_PRINTER_base( parent ) /*************************************************************************************/ { m_Parent = parent; m_Config = wxGetApp().m_EDA_Config; - + InitValues( ); if( GetSizer() ) @@ -123,45 +125,56 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( ) SetFocus(); int layer_max = NB_LAYERS; wxString msg; + BOARD* board = m_Parent->GetBoard(); - #ifdef GERBVIEW - layer_max = 32; - m_ExcludeEdgeLayer = true; // no meaning in gerbview - m_Exclude_Edges_Pcb->Show( false ); - msg = _( "Layers:" ); - - // Set wxRadioBox title to "Layers:" for copper layers and thechincal layers - // Because in Gerbview , al layers are only graphic layers (layer id has no meaning) - m_CopperLayersBoxSizer->GetStaticBox()->SetLabel( msg ); - m_TechnicalLayersBoxSizer->GetStaticBox()->SetLabel( msg ); - #endif - - /* Create layer list */ - int mask = 1, ii; - for( ii = 0; ii < layer_max; ii++, mask <<= 1 ) + // Create layer list. + int layer; + wxString layerKey; + for( layer = 0; layer < NB_LAYERS; ++layer ) { -#ifdef GERBVIEW - msg = _( "Layer" ); - msg << wxT( " " ) << ii + 1; -#else - msg = ( (WinEDA_BasePcbFrame*) m_Parent )->GetBoard()->GetLayerName( ii ); -#endif - m_BoxSelectLayer[ii] = new wxCheckBox( this, -1, msg ); - - if( mask & s_SelectedLayers ) - m_BoxSelectLayer[ii]->SetValue( TRUE ); - if( ii < 16 ) - m_CopperLayersBoxSizer->Add( m_BoxSelectLayer[ii], - wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE ); + if( !board->m_BoardSettings->IsLayerEnabled( layer ) ) + m_BoxSelectLayer[layer] = NULL; else - m_TechnicalLayersBoxSizer->Add( m_BoxSelectLayer[ii], - wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE ); + 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 + // (Front or Top to Back or Bottom) + DECLARE_LAYERS_ORDER_LIST(layersOrder); + for( int layer_idx = 0; layer_idx < NB_LAYERS; ++layer_idx ) + { + layer = layersOrder[layer_idx]; + + wxASSERT(layer < NB_LAYERS); + + if( m_BoxSelectLayer[layer] == NULL ) + continue; + + if( layer < NB_COPPER_LAYERS ) + m_CopperLayersBoxSizer->Add( m_BoxSelectLayer[layer], + 0, wxGROW | wxALL, 1 ); + else + m_TechnicalLayersBoxSizer->Add( m_BoxSelectLayer[layer], + 0, wxGROW | wxALL, 1 ); + + + layerKey.Printf( OPTKEY_LAYERBASE, layer ); + bool option; + if( m_Config->Read( layerKey, &option ) ) + m_BoxSelectLayer[layer]->SetValue( option ); + else + { + long mask = 1 << layer; + if( mask & s_SelectedLayers ) + m_BoxSelectLayer[layer]->SetValue( true ); + } + } + + // Option for excluding contents of "Edges Pcb" layer -#ifndef GERBVIEW m_Exclude_Edges_Pcb->Show( true ); -#endif // Read the scale adjust option int scale_idx = 4; // default selected scale = ScaleList[4] = 1.000 @@ -185,6 +198,9 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( ) s_SelectedLayers = 0; for( int layer = 0; layerm_Ident == GERBER_FRAME ) - layers_count = 32; - s_Parameters.m_PrintMaskLayer = 0; int ii; for( ii = 0, page_count = 0; ii < layers_count; ii++ ) { + if( m_BoxSelectLayer[ii] == NULL ) + continue; if( m_BoxSelectLayer[ii]->IsChecked() ) { page_count++; s_Parameters.m_PrintMaskLayer |= 1 << ii; } } - + // In pcbnew: force the EDGE layer to be printed or not with the other layers m_ExcludeEdgeLayer = m_Exclude_Edges_Pcb->IsChecked(); if( m_ExcludeEdgeLayer ) @@ -273,11 +288,10 @@ void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event ) m_Config->Write( OPTKEY_PRINT_PAGE_FRAME, s_Parameters.m_Print_Sheet_Ref); m_Config->Write( OPTKEY_PRINT_MONOCHROME_MODE, s_Parameters.m_Print_Black_and_White); wxString layerKey; - int layers_count = NB_LAYERS; - if( m_Parent->m_Ident == GERBER_FRAME ) - layers_count = 32; - for( int layer = 0; layerWrite( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); } @@ -292,12 +306,12 @@ void DIALOG_PRINT_USING_PRINTER::SetPrintParameters( ) { s_Parameters.m_PrintMirror = m_Print_Mirror->GetValue(); s_Parameters.m_Print_Sheet_Ref = m_Print_Sheet_Ref->GetValue(); - s_Parameters.m_Print_Black_and_White = + s_Parameters.m_Print_Black_and_White = m_ModeColorOption->GetSelection() != 0; if( m_PagesOption ) s_Parameters.m_OptionPrintPage = m_PagesOption->GetSelection() != 0; - + SetLayerMaskFromListSelection(); diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index c787485470..1694ad8fab 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -129,7 +129,7 @@ BEGIN_EVENT_TABLE( WinEDA_PcbFrame, WinEDA_BasePcbFrame ) EVT_TOOL( wxID_PASTE, WinEDA_PcbFrame::Process_Special_Functions ) EVT_TOOL( ID_UNDO_BUTT, WinEDA_PcbFrame::GetBoardFromUndoList ) EVT_TOOL( ID_REDO_BUTT, WinEDA_PcbFrame::GetBoardFromRedoList ) - EVT_TOOL( ID_GEN_PRINT, WinEDA_DrawFrame::ToPrinter ) + EVT_TOOL( ID_GEN_PRINT, WinEDA_PcbFrame::ToPrinter ) EVT_TOOL( ID_GEN_PLOT_SVG, WinEDA_DrawFrame::SVG_Print ) EVT_TOOL( ID_GEN_PLOT, WinEDA_PcbFrame::Process_Special_Functions ) EVT_TOOL( ID_FIND_ITEMS, WinEDA_PcbFrame::Process_Special_Functions ) diff --git a/pcbnew/pcbnew_config.h b/pcbnew/pcbnew_config.h index af08f100ab..87f3970ab6 100644 --- a/pcbnew/pcbnew_config.h +++ b/pcbnew/pcbnew_config.h @@ -592,6 +592,7 @@ static PARAM_CFG_SETCOLOR ColorCheveluCfg static PARAM_CFG_INT HPGLpenNumCfg ( + INSETUP, wxT( "HPGLnum" ), &g_pcb_plot_options.HPGL_Pen_Num, 1, @@ -600,6 +601,7 @@ static PARAM_CFG_INT HPGLpenNumCfg static PARAM_CFG_INT HPGLdiamCfg // HPGL pen size (mils) ( + INSETUP, wxT( "HPGdiam" ), &g_pcb_plot_options.HPGL_Pen_Diam, 15, @@ -608,6 +610,7 @@ static PARAM_CFG_INT HPGLdiamCfg // HPGL pen size (mils) static PARAM_CFG_INT HPGLspeedCfg //HPGL pen speed (cm/s) ( + INSETUP, wxT( "HPGLSpd" ), &g_pcb_plot_options.HPGL_Pen_Speed, 20, @@ -616,6 +619,7 @@ static PARAM_CFG_INT HPGLspeedCfg //HPGL pen speed (cm/s) static PARAM_CFG_INT HPGLrecouvrementCfg ( + INSETUP, wxT( "HPGLrec" ), &g_pcb_plot_options.HPGL_Pen_Recouvrement, 2, diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index a8e3c44a51..8c7f2199d1 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -16,10 +16,11 @@ #include "protos.h" #include "pcbstruct.h" #include "class_board_design_settings.h" +#include "dialog_plot_base.h" #define PLOT_DEFAULT_MARGE 300 // mils -/* Keywords to r/w options in config */ +/* Keywords to r/w options in m_Config */ #define OPTKEY_EDGELAYER_GERBER wxT( "EdgeLayerGerberOpt" ) #define OPTKEY_GERBER_EXTENSIONS wxT( "GerberOptUseLayersExt" ) #define OPTKEY_XFINESCALE_ADJ wxT( "PlotXFineScaleAdj" ) @@ -53,31 +54,6 @@ static long s_SelectedLayers = LAYER_BACK | LAYER_FRONT | static bool s_PlotOriginIsAuxAxis = FALSE; -enum id_plotps { - ID_DRILL_SHAPE_OPT = 8020, - ID_SCALE_OPT, - ID_ROTATE_OPT, - ID_MIROR_OPT, - ID_EXEC_PLOT, - ID_PLOT_MODE_OPT, - ID_MASKVIA_OPT, - ID_PLOT_CENTRE_OPT, - ID_SEL_PLOT_FORMAT, - ID_SEL_GERBER_FORMAT, - ID_SAVE_OPT_PLOT, - ID_EXCLUDE_EDGES_PCB, - ID_PRINT_REF, - ID_PRINT_VALUE, - ID_PRINT_MODULE_TEXTS, - ID_FORCE_PRINT_INVISIBLE_TEXT, - ID_PRINT_PAD_ON_SILKSCREEN, - ID_FORCE_PRINT_PAD, - ID_CREATE_DRILL_FILE, - ID_SEL_PLOT_OFFSET_OPTION, - ID_USE_GERBER_EXTENSIONS -}; - - /* The group of plot options - sadly global XXX */ PCB_Plot_Options g_pcb_plot_options; @@ -85,39 +61,15 @@ PCB_Plot_Options g_pcb_plot_options; /* Dialog box for plot control */ /*******************************/ -class WinEDA_PlotFrame : public wxDialog +class DIALOG_PLOT : public DIALOG_PLOT_BASE { public: - WinEDA_BasePcbFrame* m_Parent; - wxButton* m_PlotButton; // button with initial focus - wxCheckBox* m_BoxSelectLayer[32]; - wxRadioBox* m_PlotFormatOpt; - wxRadioBox* m_Choice_Plot_Offset; - wxRadioBox* m_Drill_Shape_Opt; - wxRadioBox* m_Scale_Opt; - wxRadioBox* m_PlotModeOpt; - wxCheckBox* m_PlotMirorOpt; - wxCheckBox* m_PlotNoViaOnMaskOpt; - wxCheckBox* m_Exclude_Edges_Pcb; - wxCheckBox* m_Use_Gerber_Extensions; - wxCheckBox* m_Plot_Sheet_Ref; - wxCheckBox* m_Plot_Invisible_Text; - wxCheckBox* m_Plot_Text_Value; - wxCheckBox* m_Plot_Text_Ref; - wxCheckBox* m_Plot_Text_Div; - wxCheckBox* m_Plot_Pads_on_Silkscreen; - wxCheckBox* m_Force_Plot_Pads; - wxCheckBox* m_Plot_PS_Negative; - WinEDA_ValueCtrl* m_LinesWidth; - WinEDA_ValueCtrl* m_HPGLPenSizeOpt; - WinEDA_ValueCtrl* m_HPGLPenSpeedOpt; - WinEDA_ValueCtrl* m_HPGLPenOverlayOpt; - wxStaticBox* m_HPGL_OptionsBox; + WinEDA_PcbFrame* m_Parent; + wxConfig* m_Config; + wxCheckBox* m_BoxSelectLayer[LAYER_COUNT]; // wxCheckBox list to select/deselec layers to plot + double m_XScaleAdjust; + double m_YScaleAdjust; - WinEDA_DFloatValueCtrl* m_FineAdjustXscaleOpt; - WinEDA_DFloatValueCtrl* m_FineAdjustYscaleOpt; - double m_XScaleAdjust; - double m_YScaleAdjust; bool useA4() { @@ -152,425 +104,218 @@ public: public: - WinEDA_PlotFrame( WinEDA_BasePcbFrame* parent ); + DIALOG_PLOT( WinEDA_PcbFrame* parent ); private: - void OnInitDialog( wxInitDialogEvent& event ); + void Init_Dialog(); void Plot( wxCommandEvent& event ); void OnQuit( wxCommandEvent& event ); void OnClose( wxCloseEvent& event ); - void SetCommands( wxCommandEvent& event ); + void SetPlotFormat( wxCommandEvent& event ); void OnSetScaleOpt( wxCommandEvent& event ); void SaveOptPlot( wxCommandEvent& event ); void CreateDrillFile( wxCommandEvent& event ); - - DECLARE_EVENT_TABLE() }; -BEGIN_EVENT_TABLE( WinEDA_PlotFrame, wxDialog ) -EVT_INIT_DIALOG( WinEDA_PlotFrame::OnInitDialog ) -EVT_CLOSE( WinEDA_PlotFrame::OnClose ) -EVT_BUTTON( wxID_CANCEL, WinEDA_PlotFrame::OnQuit ) -EVT_BUTTON( ID_EXEC_PLOT, WinEDA_PlotFrame::Plot ) -EVT_BUTTON( ID_SAVE_OPT_PLOT, WinEDA_PlotFrame::SaveOptPlot ) -EVT_BUTTON( ID_CREATE_DRILL_FILE, WinEDA_PlotFrame::CreateDrillFile ) -EVT_RADIOBOX( ID_SEL_PLOT_FORMAT, WinEDA_PlotFrame::SetCommands ) -EVT_RADIOBOX( ID_SCALE_OPT, WinEDA_PlotFrame::OnSetScaleOpt ) -END_EVENT_TABLE() - const int UNITS_MILS = 1000; -WinEDA_PlotFrame::WinEDA_PlotFrame( WinEDA_BasePcbFrame* parent ) : - wxDialog( parent, -1, _( "Plot" ), wxPoint( -1, -1 ), wxDefaultSize, - wxDEFAULT_DIALOG_STYLE ) +DIALOG_PLOT::DIALOG_PLOT( WinEDA_PcbFrame* parent ) : + DIALOG_PLOT_BASE( parent ) { m_Parent = parent; + m_Config = wxGetApp().m_EDA_Config; + + Init_Dialog(); + + GetSizer()->Fit( this ); + GetSizer()->SetSizeHints( this ); Centre(); } -void WinEDA_PlotFrame::OnInitDialog( wxInitDialogEvent& event ) +void DIALOG_PLOT::Init_Dialog() { - wxButton* button; + wxString msg; - BOARD* board = m_Parent->GetBoard(); + BOARD* board = m_Parent->GetBoard(); - wxConfig* config = wxGetApp().m_EDA_Config; - - m_Plot_Sheet_Ref = NULL; - - wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - - SetSizer( MainBoxSizer ); - wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* MidRightBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* MidLeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - - MainBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); - MainBoxSizer->Add( MidLeftBoxSizer, 0, wxGROW | wxALL, 5 ); - MainBoxSizer->Add( MidRightBoxSizer, 0, wxGROW | wxALL, 5 ); - MainBoxSizer->Add( RightBoxSizer, 0, wxGROW | wxALL, 5 ); - - wxBoxSizer* LayersBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - - LeftBoxSizer->Add( LayersBoxSizer, 0, wxGROW | wxALL, 5 ); - - static const wxString fmtmsg[5] = - { - wxT( "HPGL" ), - wxT( "Gerber" ), - wxT( "Postscript" ), - wxT( "Postscript A4" ), - wxT( "DXF Export" ) - }; - - m_PlotFormatOpt = new wxRadioBox( this, ID_SEL_PLOT_FORMAT, - _( "Plot Format" ), wxDefaultPosition, - wxSize( -1, -1 ), - 5, fmtmsg, 1, wxRA_SPECIFY_COLS ); - MidRightBoxSizer->Add( m_PlotFormatOpt, 0, wxGROW | wxALL, 5 ); - - config->Read( OPTKEY_OUTPUT_FORMAT, &g_pcb_plot_options.PlotFormat ); - config->Read( OPTKEY_PLOT_LINEWIDTH_VALUE, - &g_pcb_plot_options.PlotLine_Width ); + m_Config->Read( OPTKEY_OUTPUT_FORMAT, &g_pcb_plot_options.PlotFormat ); + m_Config->Read( OPTKEY_PLOT_LINEWIDTH_VALUE, &g_pcb_plot_options.PlotLine_Width ); + m_Config->Read( OPTKEY_EDGELAYER_GERBER, &g_pcb_plot_options.Exclude_Edges_Pcb ); + m_Config->Read( OPTKEY_XFINESCALE_ADJ, &m_XScaleAdjust ); + m_Config->Read( OPTKEY_YFINESCALE_ADJ, &m_YScaleAdjust ); m_PlotFormatOpt->SetSelection( g_pcb_plot_options.PlotFormat ); - m_HPGL_OptionsBox = new wxStaticBox( this, wxID_ANY, _( "HPGL Options:" ) ); - wxStaticBoxSizer* HPGL_OptionsBoxSizer = - new wxStaticBoxSizer( m_HPGL_OptionsBox, wxVERTICAL ); - MidRightBoxSizer->Add( HPGL_OptionsBoxSizer, 0, wxGROW | wxALL, 5 ); - m_HPGLPenSizeOpt = new WinEDA_ValueCtrl( this, _( "Pen size" ), - g_pcb_plot_options.HPGL_Pen_Diam, - g_UnitMetric, - HPGL_OptionsBoxSizer, - UNITS_MILS ); + // Set units and value for HPGL pen speed. + AddUnitSymbol( *m_textPenSize, g_UnitMetric ); + msg = ReturnStringFromValue( g_UnitMetric, g_pcb_plot_options.HPGL_Pen_Diam, UNITS_MILS ); + m_HPGLPenSizeOpt->AppendText( msg ); // Set units to cm for standard HPGL pen speed. - m_HPGLPenSpeedOpt = new WinEDA_ValueCtrl( this, _( "Pen Speed (cm/s)" ), - g_pcb_plot_options.HPGL_Pen_Speed, CENTIMETRE, - HPGL_OptionsBoxSizer, 1 ); + msg = ReturnStringFromValue( CENTIMETRE, g_pcb_plot_options.HPGL_Pen_Speed, 1 ); + m_HPGLPenSpeedOpt->AppendText( msg ); - m_HPGLPenSpeedOpt->SetToolTip( _( "Set pen speed in cm/s" ) ); + // Set units and value for HPGL pen overlay. + AddUnitSymbol( *m_textPenOvr, g_UnitMetric ); + msg = ReturnStringFromValue( g_UnitMetric, + g_pcb_plot_options.HPGL_Pen_Recouvrement, + UNITS_MILS ); + m_HPGLPenOverlayOpt->AppendText( msg ); - m_HPGLPenOverlayOpt = new WinEDA_ValueCtrl( this, _( "Pen ovr" ), - g_pcb_plot_options.HPGL_Pen_Recouvrement, - g_UnitMetric, - HPGL_OptionsBoxSizer, - UNITS_MILS ); - - m_HPGLPenOverlayOpt->SetToolTip( _( "Set plot overlay for filling" ) ); - - m_LinesWidth = new WinEDA_ValueCtrl( this, _( "Line width" ), - g_pcb_plot_options.PlotLine_Width, - g_UnitMetric, - MidRightBoxSizer, - PCB_INTERNAL_UNIT ); - - m_LinesWidth->SetToolTip( _( - "Set lines width used to plot in sketch \ -mode and plot pads outlines on silk screen layers" ) ); - - // Create the right column commands - static const wxString choice_plot_offset_msg[] = - { _( "Absolute" ), _( "Auxiliary axis" ) }; - - m_Choice_Plot_Offset = new wxRadioBox( this, ID_SEL_PLOT_OFFSET_OPTION, - _( "Plot Origin" ), - wxDefaultPosition, - wxSize( -1, -1 ), - 2, choice_plot_offset_msg, 1, - wxRA_SPECIFY_COLS ); + msg = ReturnStringFromValue( g_UnitMetric, + g_pcb_plot_options.PlotLine_Width, + PCB_INTERNAL_UNIT ); + m_LinesWidth->AppendText( msg ); if( s_PlotOriginIsAuxAxis ) m_Choice_Plot_Offset->SetSelection( 1 ); - RightBoxSizer->Add( m_Choice_Plot_Offset, 0, wxGROW | wxALL, 5 ); - /* Add a spacer for a better look */ - RightBoxSizer->Add( 5, 5, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20 ); // Create scale adjust option m_XScaleAdjust = m_YScaleAdjust = 1.0; - config->Read( OPTKEY_EDGELAYER_GERBER, &g_pcb_plot_options.Exclude_Edges_Pcb ); - config->Read( OPTKEY_XFINESCALE_ADJ, &m_XScaleAdjust ); - config->Read( OPTKEY_YFINESCALE_ADJ, &m_YScaleAdjust ); - // Test for a reasonable scale value. Set to 1 if problem if( m_XScaleAdjust < MIN_SCALE || m_YScaleAdjust < MIN_SCALE || m_XScaleAdjust > MAX_SCALE || m_YScaleAdjust > MAX_SCALE ) m_XScaleAdjust = m_YScaleAdjust = 1.0; - m_FineAdjustXscaleOpt = new WinEDA_DFloatValueCtrl( this, - _( "X scale adjust" ), - m_XScaleAdjust, - RightBoxSizer ); - m_FineAdjustXscaleOpt->SetToolTip( _( "Set X scale adjust for exact \ -scale plotting" ) ); + msg.Printf( wxT( "%f" ), m_XScaleAdjust ); + m_FineAdjustXscaleOpt->AppendText( msg ); - m_FineAdjustYscaleOpt = new WinEDA_DFloatValueCtrl( this, - _( "Y scale adjust" ), - m_YScaleAdjust, - RightBoxSizer ); - m_FineAdjustYscaleOpt->SetToolTip( _( "Set Y scale adjust for exact \ -scale plotting" ) ); + msg.Printf( wxT( "%f" ), m_YScaleAdjust ); + m_FineAdjustYscaleOpt->AppendText( msg ); - m_Plot_PS_Negative = new wxCheckBox( this, -1, _( "Plot negative" ) ); m_Plot_PS_Negative->SetValue( g_pcb_plot_options.Plot_PS_Negative ); - RightBoxSizer->Add( m_Plot_PS_Negative, 0, wxGROW | wxALL, 5 ); - /* Create the command buttons */ - m_PlotButton = new wxButton( this, ID_EXEC_PLOT, _( "Plot" ) ); - RightBoxSizer->Add( m_PlotButton, 0, wxGROW | wxALL, 5 ); - - button = new wxButton( this, ID_SAVE_OPT_PLOT, _( "Save Options" ) ); - RightBoxSizer->Add( button, 0, wxGROW | wxALL, 5 ); - - button = new wxButton( this, ID_CREATE_DRILL_FILE, - _( "Generate drill file" ) ); - RightBoxSizer->Add( button, 0, wxGROW | wxALL, 5 ); - - button = new wxButton( this, wxID_CANCEL, _( "Close" ) ); - RightBoxSizer->Add( button, 0, wxGROW | wxALL, 5 ); - // Create layer list. - wxBoxSizer* OneColumnLayerBoxSizer = new wxBoxSizer( wxVERTICAL ); - LayersBoxSizer->Add( OneColumnLayerBoxSizer, 0, wxGROW | wxALL, 5 ); - - int mask = 1; - - for( int layer = 0; layerAdd( OneColumnLayerBoxSizer, 0, wxGROW | wxALL, 5 ); - } - + if( !board->m_BoardSettings->IsLayerEnabled( layer ) ) + m_BoxSelectLayer[layer] = NULL; + else m_BoxSelectLayer[layer] = new wxCheckBox( this, -1, board->GetLayerName( layer ) ); + } - if( mask & s_SelectedLayers ) - m_BoxSelectLayer[layer]->SetValue( true ); + // Add wxCheckBoxes in layers lists dialog + // List layers in same order than in setup layers dialog + // (Front or Top to Back or Bottom) + DECLARE_LAYERS_ORDER_LIST(layersOrder); + for( int layer_idx = 0; layer_idx < NB_LAYERS; ++layer_idx ) + { + layer = layersOrder[layer_idx]; - OneColumnLayerBoxSizer->Add( m_BoxSelectLayer[layer], + wxASSERT(layer < NB_LAYERS); + + if( m_BoxSelectLayer[layer] == NULL ) + continue; + + if( layer < NB_COPPER_LAYERS ) + m_CopperLayersBoxSizer->Add( m_BoxSelectLayer[layer], + 0, wxGROW | wxALL, 1 ); + else + m_TechnicalLayersBoxSizer->Add( m_BoxSelectLayer[layer], 0, wxGROW | wxALL, 1 ); - } - if( config ) - { - wxString layerKey; - for( int layer = 0; layer < NB_LAYERS; ++layer ) + layerKey.Printf( OPTKEY_LAYERBASE, layer ); + bool option; + if( m_Config->Read( layerKey, &option ) ) + m_BoxSelectLayer[layer]->SetValue( option ); + else { - bool option; - - layerKey.Printf( OPTKEY_LAYERBASE, layer ); - - if( config->Read( layerKey, &option ) ) - m_BoxSelectLayer[layer]->SetValue( option ); + long mask = 1 << layer; + if( mask & s_SelectedLayers ) + m_BoxSelectLayer[layer]->SetValue( true ); } } - // Disable checkboxes if the corresponding layer is not enabled - for( int layer = 0; layerm_BoardSettings->IsLayerEnabled( layer ) ) - { - m_BoxSelectLayer[layer]->Enable( false ); - m_BoxSelectLayer[layer]->SetValue( false ); - } - } // Option for using proper Gerber extensions - m_Use_Gerber_Extensions = new wxCheckBox( this, - ID_USE_GERBER_EXTENSIONS, - _( "Use Proper Gerber Extensions" ) ); - long ltmp; - config->Read( OPTKEY_GERBER_EXTENSIONS, <mp ); + m_Config->Read( OPTKEY_GERBER_EXTENSIONS, <mp ); m_Use_Gerber_Extensions->SetValue( ltmp ); - m_Use_Gerber_Extensions->SetToolTip( - _( "Use Proper Gerber Extensions - .GBL, .GTL, etc..." ) ); - LeftBoxSizer->Add( m_Use_Gerber_Extensions, 0, wxGROW | wxALL, 1 ); // Option for excluding contents of "Edges Pcb" layer - - m_Exclude_Edges_Pcb = new wxCheckBox( this, - ID_EXCLUDE_EDGES_PCB, - _( "Exclude pcb edge layer" ) ); - m_Exclude_Edges_Pcb->SetValue( g_pcb_plot_options.Exclude_Edges_Pcb ); - m_Exclude_Edges_Pcb->SetToolTip( - _( "Exclude contents of the pcb edge layer from all other layers" ) ); - LeftBoxSizer->Add( m_Exclude_Edges_Pcb, 0, wxGROW | wxALL, 1 ); // Option to plot page references: if( m_Parent->m_Print_Sheet_Ref ) { - m_Plot_Sheet_Ref = new wxCheckBox( this, ID_PRINT_REF, - _( "Print sheet reference" ) ); - m_Plot_Sheet_Ref->SetValue( g_pcb_plot_options.Plot_Frame_Ref ); - LeftBoxSizer->Add( m_Plot_Sheet_Ref, 0, wxGROW | wxALL, 1 ); } else + { + m_Plot_Sheet_Ref->Enable( false ); g_pcb_plot_options.Plot_Frame_Ref = false; + } // Option to plot pads on silkscreen layers or all layers - m_Plot_Pads_on_Silkscreen = new wxCheckBox( this, - ID_PRINT_PAD_ON_SILKSCREEN, - _( "Print pads on silkscreen" ) ); - - config->Read( OPTKEY_PADS_ON_SILKSCREEN, - &g_pcb_plot_options.PlotPadsOnSilkLayer ); + m_Config->Read( OPTKEY_PADS_ON_SILKSCREEN, + &g_pcb_plot_options.PlotPadsOnSilkLayer ); m_Plot_Pads_on_Silkscreen->SetValue( &g_pcb_plot_options.PlotPadsOnSilkLayer ); - m_Plot_Pads_on_Silkscreen->SetToolTip( - _( "Enable/disable print/plot pads on silkscreen layers" ) ); - LeftBoxSizer->Add( m_Plot_Pads_on_Silkscreen, 0, wxGROW | wxALL, 1 ); - m_Force_Plot_Pads = new wxCheckBox( this, ID_FORCE_PRINT_PAD, - _( "Always print pads" ) ); - config->Read( OPTKEY_ALWAYS_PRINT_PADS, - &g_pcb_plot_options.Plot_Pads_All_Layers ); + m_Config->Read( OPTKEY_ALWAYS_PRINT_PADS, + &g_pcb_plot_options.Plot_Pads_All_Layers ); m_Force_Plot_Pads->SetValue( g_pcb_plot_options.Plot_Pads_All_Layers ); - m_Force_Plot_Pads->SetToolTip( _( "Force print/plot pads on ALL layers" ) ); - LeftBoxSizer->Add( m_Force_Plot_Pads, 0, wxGROW | wxALL, 1 ); // Options to plot texts on footprints - m_Plot_Text_Value = new wxCheckBox( this, ID_PRINT_VALUE, - _( "Print module value" ) ); - m_Plot_Text_Value->SetValue( g_pcb_plot_options.Sel_Texte_Valeur ); - m_Plot_Text_Value->SetToolTip( - _( "Enable/disable print/plot module value on silkscreen layers" ) ); - LeftBoxSizer->Add( m_Plot_Text_Value, 0, wxGROW | wxALL, 1 ); - - m_Plot_Text_Ref = new wxCheckBox( this, ID_PRINT_REF, - _( "Print module reference" ) ); - m_Plot_Text_Ref->SetValue( g_pcb_plot_options.Sel_Texte_Reference ); - m_Plot_Text_Ref->SetToolTip( - _( "Enable/disable print/plot module reference on silkscreen layers" ) ); - LeftBoxSizer->Add( m_Plot_Text_Ref, 0, wxGROW | wxALL, 1 ); - - m_Plot_Text_Div = new wxCheckBox( this, ID_PRINT_MODULE_TEXTS, - _( "Print other module texts" ) ); - m_Plot_Text_Div->SetValue( g_pcb_plot_options.Sel_Texte_Divers ); - m_Plot_Text_Div->SetToolTip( - _( "Enable/disable print/plot module field texts on silkscreen layers" ) ); - LeftBoxSizer->Add( m_Plot_Text_Div, 0, wxGROW | wxALL, 1 ); - - m_Plot_Invisible_Text = new wxCheckBox( this, - ID_FORCE_PRINT_INVISIBLE_TEXT, - _( "Force print invisible texts" ) ); - m_Plot_Invisible_Text->SetValue( g_pcb_plot_options.Sel_Texte_Invisible ); - m_Plot_Invisible_Text->SetToolTip( - _( "Force print/plot module invisible texts on silkscreen layers" ) ); - LeftBoxSizer->Add( m_Plot_Invisible_Text, 0, wxGROW | wxALL, 1 ); - - - static const wxString drillmsg[3] = - { - _( "No drill mark" ), - _( "Small mark" ), - _( "Real drill" ) - }; - - m_Drill_Shape_Opt = new wxRadioBox( this, ID_DRILL_SHAPE_OPT, - _( "Pads Drill Opt" ), - wxDefaultPosition, wxSize( -1, -1 ), - 3, drillmsg, 1, wxRA_SPECIFY_COLS ); + // Options to plot pads and vias holes m_Drill_Shape_Opt->SetSelection( g_pcb_plot_options.DrillShapeOpt ); - MidLeftBoxSizer->Add( m_Drill_Shape_Opt, 0, wxGROW | wxALL, 5 ); - - static const wxString scalemsg[5] = - { - _( "Auto scale" ), - _( "Scale 1" ), - _( "Scale 1.5" ), - _( "Scale 2" ), - _( "Scale 3" ) - }; - - m_Scale_Opt = new wxRadioBox( this, ID_SCALE_OPT, - _( "Scale Opt" ), wxDefaultPosition, - wxSize( -1, -1 ), - 5, scalemsg, 1, wxRA_SPECIFY_COLS ); + // Scale option m_Scale_Opt->SetSelection( g_pcb_plot_options.PlotScaleOpt ); - MidLeftBoxSizer->Add( m_Scale_Opt, 0, wxGROW | wxALL, 5 ); - - static const wxString list_opt3[3] = - { - _( "Line" ), _( "Filled" ), - _( "Sketch" ) - }; - - m_PlotModeOpt = new wxRadioBox( this, ID_PLOT_MODE_OPT, _( "Plot Mode" ), - wxDefaultPosition, wxDefaultSize, - 3, list_opt3, 1 ); + // Plot mode m_PlotModeOpt->SetSelection( g_pcb_plot_options.Trace_Mode ); - MidLeftBoxSizer->Add( m_PlotModeOpt, 0, wxGROW | wxALL, 5 ); - - m_PlotMirorOpt = new wxCheckBox( this, ID_MIROR_OPT, - _( "Plot mirror" ) ); + // Plot mirror option m_PlotMirorOpt->SetValue( g_pcb_plot_options.Plot_Set_MIROIR ); - MidLeftBoxSizer->Add( m_PlotMirorOpt, 0, wxGROW | wxALL, 5 ); - - m_PlotNoViaOnMaskOpt = new wxCheckBox( this, ID_MASKVIA_OPT, - _( "Vias on mask" ) ); + // Put vias on mask layer m_PlotNoViaOnMaskOpt->SetValue( g_pcb_plot_options.DrawViaOnMaskLayer ); - m_PlotNoViaOnMaskOpt->SetToolTip( - _( "Print/plot vias on mask layers. They are in this case not protected" ) ); - MidLeftBoxSizer->Add( m_PlotNoViaOnMaskOpt, 0, wxGROW | wxALL, 5 ); // Update options values: wxCommandEvent cmd_event; - SetCommands( cmd_event ); + SetPlotFormat( cmd_event ); OnSetScaleOpt( cmd_event ); - GetSizer()->Fit( this ); - GetSizer()->SetSizeHints( this ); - // without this line, the ESC key does not work SetFocus(); } -void WinEDA_PlotFrame::OnQuit( wxCommandEvent& WXUNUSED(event) ) +void DIALOG_PLOT::OnQuit( wxCommandEvent& WXUNUSED(event) ) { Close( true ); // true is to force the frame to close } -void WinEDA_PlotFrame::OnClose( wxCloseEvent& event ) +void DIALOG_PLOT::OnClose( wxCloseEvent& event ) { EndModal( 0 ); } -void WinEDA_PlotFrame::CreateDrillFile( wxCommandEvent& event ) +void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event ) { ( (WinEDA_PcbFrame*) m_Parent )->InstallDrillFrame( event ); } -void WinEDA_PlotFrame::OnSetScaleOpt( wxCommandEvent& event ) +void DIALOG_PLOT::OnSetScaleOpt( wxCommandEvent& event ) { /* Disable sheet reference for scale != 1:1 */ bool scale1 = ( m_Scale_Opt->GetSelection() == 1 ); @@ -582,7 +327,7 @@ void WinEDA_PlotFrame::OnSetScaleOpt( wxCommandEvent& event ) } -void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) +void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event ) { int format = getFormat(); @@ -595,7 +340,6 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_PlotMirorOpt->Enable( true ); m_Choice_Plot_Offset->Enable( false ); m_LinesWidth->Enable( true ); - m_HPGL_OptionsBox->Enable( false ); m_HPGLPenSizeOpt->Enable( false ); m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); @@ -616,7 +360,6 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_PlotMirorOpt->Enable( false ); m_Choice_Plot_Offset->Enable( true ); m_LinesWidth->Enable( true ); - m_HPGL_OptionsBox->Enable( false ); m_HPGLPenSizeOpt->Enable( false ); m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); @@ -636,7 +379,6 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_PlotModeOpt->Enable( true ); m_Choice_Plot_Offset->Enable( false ); m_LinesWidth->Enable( false ); - m_HPGL_OptionsBox->Enable( true ); m_HPGLPenSizeOpt->Enable( true ); m_HPGLPenSpeedOpt->Enable( true ); m_HPGLPenOverlayOpt->Enable( true ); @@ -657,7 +399,6 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_PlotModeOpt->Enable( true ); m_Choice_Plot_Offset->Enable( false ); m_LinesWidth->Enable( false ); - m_HPGL_OptionsBox->Enable( false ); m_HPGLPenSizeOpt->Enable( false ); m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); @@ -677,7 +418,7 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) } -void WinEDA_PlotFrame::SaveOptPlot( wxCommandEvent& event ) +void DIALOG_PLOT::SaveOptPlot( wxCommandEvent& event ) { g_pcb_plot_options.Exclude_Edges_Pcb = m_Exclude_Edges_Pcb->GetValue(); @@ -706,49 +447,61 @@ void WinEDA_PlotFrame::SaveOptPlot( wxCommandEvent& event ) g_pcb_plot_options.Trace_Mode = (GRTraceMode) m_PlotModeOpt->GetSelection(); g_pcb_plot_options.DrawViaOnMaskLayer = m_PlotNoViaOnMaskOpt->GetValue(); - g_pcb_plot_options.HPGL_Pen_Diam = m_HPGLPenSizeOpt->GetValue(); - g_pcb_plot_options.HPGL_Pen_Speed = m_HPGLPenSpeedOpt->GetValue(); - g_pcb_plot_options.HPGL_Pen_Recouvrement = m_HPGLPenOverlayOpt->GetValue(); - g_pcb_plot_options.PlotLine_Width = m_LinesWidth->GetValue(); + wxString msg = m_HPGLPenSizeOpt->GetValue(); + int tmp = ReturnValueFromString( g_UnitMetric, msg, UNITS_MILS ); + g_pcb_plot_options.HPGL_Pen_Diam = tmp; - m_XScaleAdjust = m_FineAdjustXscaleOpt->GetValue(); - m_YScaleAdjust = m_FineAdjustYscaleOpt->GetValue(); + msg = m_HPGLPenSpeedOpt->GetValue(); + tmp = ReturnValueFromString( CENTIMETRE, msg, 1 ); + g_pcb_plot_options.HPGL_Pen_Speed = tmp; - wxConfig* config = wxGetApp().m_EDA_Config; + msg = m_HPGLPenOverlayOpt->GetValue(); + tmp = ReturnValueFromString( g_UnitMetric, msg, UNITS_MILS ); + g_pcb_plot_options.HPGL_Pen_Recouvrement = tmp; - config->Write( OPTKEY_EDGELAYER_GERBER, - g_pcb_plot_options.Exclude_Edges_Pcb ); - config->Write( OPTKEY_GERBER_EXTENSIONS, - m_Use_Gerber_Extensions->GetValue() ); - config->Write( OPTKEY_XFINESCALE_ADJ, m_XScaleAdjust ); - config->Write( OPTKEY_YFINESCALE_ADJ, m_YScaleAdjust ); - config->Write( OPTKEY_PADS_ON_SILKSCREEN, - g_pcb_plot_options.PlotPadsOnSilkLayer ); - config->Write( OPTKEY_ALWAYS_PRINT_PADS, - g_pcb_plot_options.Plot_Pads_All_Layers ); + msg = m_LinesWidth->GetValue(); + tmp = ReturnValueFromString( g_UnitMetric, msg, PCB_INTERNAL_UNIT ); + g_pcb_plot_options.PlotLine_Width = tmp; + + msg = m_FineAdjustXscaleOpt->GetValue(); + msg.ToDouble( &m_XScaleAdjust ); + msg = m_FineAdjustYscaleOpt->GetValue(); + msg.ToDouble( &m_YScaleAdjust ); + + m_Config->Write( OPTKEY_EDGELAYER_GERBER, + g_pcb_plot_options.Exclude_Edges_Pcb ); + m_Config->Write( OPTKEY_GERBER_EXTENSIONS, + m_Use_Gerber_Extensions->GetValue() ); + m_Config->Write( OPTKEY_XFINESCALE_ADJ, m_XScaleAdjust ); + m_Config->Write( OPTKEY_YFINESCALE_ADJ, m_YScaleAdjust ); + m_Config->Write( OPTKEY_PADS_ON_SILKSCREEN, + g_pcb_plot_options.PlotPadsOnSilkLayer ); + m_Config->Write( OPTKEY_ALWAYS_PRINT_PADS, + g_pcb_plot_options.Plot_Pads_All_Layers ); int formatNdx = m_PlotFormatOpt->GetSelection(); - config->Write( OPTKEY_OUTPUT_FORMAT, formatNdx ); - config->Write( OPTKEY_PLOT_LINEWIDTH_VALUE, - g_pcb_plot_options.PlotLine_Width ); + m_Config->Write( OPTKEY_OUTPUT_FORMAT, formatNdx ); + m_Config->Write( OPTKEY_PLOT_LINEWIDTH_VALUE, + g_pcb_plot_options.PlotLine_Width ); wxString layerKey; for( int layer = 0; layerWrite( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); + m_Config->Write( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); } g_pcb_plot_options.Plot_PS_Negative = m_Plot_PS_Negative->GetValue(); } -void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) +void DIALOG_PLOT::Plot( wxCommandEvent& event ) { - int layer_to_plot; + int layer; wxFileName fn; wxString ext; - wxString wildcard; BOARD* board = m_Parent->GetBoard(); @@ -778,10 +531,10 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) * the default scale adjust is initialized to 0 and saved in program * settings resulting in a divide by zero fault. */ - if( m_FineAdjustXscaleOpt->m_ValueCtrl->IsEnabled() + if( m_FineAdjustXscaleOpt - IsEnabled() && m_XScaleAdjust != 0.0 ) g_pcb_plot_options.ScaleAdjX = m_XScaleAdjust; - if( m_FineAdjustYscaleOpt->m_ValueCtrl->IsEnabled() + if( m_FineAdjustYscaleOpt->IsEnabled() && m_YScaleAdjust != 0.0 ) g_pcb_plot_options.ScaleAdjY = m_YScaleAdjust; @@ -791,24 +544,20 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) { case PLOT_FORMAT_POST: ext = wxT( "ps" ); - wildcard = _( "Adobe post script files (.ps)|*.ps" ); break; case PLOT_FORMAT_GERBER: g_pcb_plot_options.Scale = 1.0; // No scale option allowed in gerber format ext = wxT( "pho" ); - wildcard = _( "GERBER photo plot files (.pho .gbr)|*.pho;*.gbr" ); break; case PLOT_FORMAT_HPGL: ext = wxT( "plt" ); - wildcard = _( "HPGL plot files (.plt)|*.plt" ); break; case PLOT_FORMAT_DXF: g_pcb_plot_options.Scale = 1.0; ext = wxT( "dxf" ); - wildcard = _( "DXF files (.dxf)|*.dxf" ); break; } @@ -822,27 +571,27 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) int mask = 1; s_SelectedLayers = 0; - - for( layer_to_plot = 0; - layer_to_plot < NB_LAYERS; - layer_to_plot++, mask <<= 1 ) + for( layer = 0; layer < NB_LAYERS; layer++, mask <<= 1 ) { - if( m_BoxSelectLayer[layer_to_plot]->GetValue() ) + if( m_BoxSelectLayer[layer] == NULL ) + continue; + bool success = false; + if( m_BoxSelectLayer[layer]->GetValue() ) { s_SelectedLayers |= mask; fn = m_Parent->GetScreen()->m_FileName; // Create file name. - wxString layername = board->GetLayerName( layer_to_plot ); - layername.Trim(true); layername.Trim(false); // remove leading and trailing spaces if any + wxString layername = board->GetLayerName( layer ); + layername.Trim( true ); layername.Trim( false ); // remove leading and trailing spaces if any fn.SetName( fn.GetName() + wxT( "-" ) + layername ); // Use Gerber Extensions based on layer number // (See http://en.wikipedia.org/wiki/Gerber_File) if( (format == PLOT_FORMAT_GERBER) && m_Use_Gerber_Extensions->GetValue() ) { - switch( layer_to_plot ) + switch( layer ) { case LAYER_N_FRONT: fn.SetExt( wxT( "gtl" ) ); @@ -863,8 +612,8 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) case LAYER_N_14: case LAYER_N_15: - // TODO: use g1 to gxx according to the - // new internal layers designation + // TODO: see if we use .gbr or a layer identifier (gb1 .. gbnn ?) + // according to the new internal layers designation // (1 is the first internal layer from the front layer) fn.SetExt( wxT( "gbr" ) ); break; @@ -910,6 +659,7 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) case ECO1_N: case ECO2_N: case EDGE_N: + default: fn.SetExt( wxT( "gbr" ) ); break; } @@ -922,39 +672,49 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) switch( format ) { case PLOT_FORMAT_POST: - m_Parent->Genere_PS( fn.GetFullPath(), layer_to_plot, useA4(), - g_pcb_plot_options.Trace_Mode ); + success = m_Parent->Genere_PS( fn.GetFullPath(), layer, useA4(), + g_pcb_plot_options.Trace_Mode ); break; case PLOT_FORMAT_GERBER: - m_Parent->Genere_GERBER( fn.GetFullPath(), layer_to_plot, - s_PlotOriginIsAuxAxis, - g_pcb_plot_options.Trace_Mode ); + success = m_Parent->Genere_GERBER( fn.GetFullPath(), layer, + s_PlotOriginIsAuxAxis, + g_pcb_plot_options.Trace_Mode ); break; case PLOT_FORMAT_HPGL: - m_Parent->Genere_HPGL( fn.GetFullPath(), layer_to_plot, - g_pcb_plot_options.Trace_Mode ); + success = m_Parent->Genere_HPGL( fn.GetFullPath(), layer, + g_pcb_plot_options.Trace_Mode ); break; case PLOT_FORMAT_DXF: - m_Parent->Genere_DXF( fn.GetFullPath(), layer_to_plot, - g_pcb_plot_options.Trace_Mode ); + success = m_Parent->Genere_DXF( fn.GetFullPath(), layer, + g_pcb_plot_options.Trace_Mode ); break; } + + // Print diags in messages box: + wxString msg; + if( success ) + msg.Printf( _( "Plot file <%s> created" ), GetChars( fn.GetFullPath() ) ); + else + msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); + msg << wxT( "\n" ); + m_MessagesBox->AppendText( msg ); } } - // If no layer selected, we have no plot. prompt user if it happens + // If no layer selected, we have nothing plotted. + // Prompt user if it happens // because he could think there is a bug in pcbnew: if( s_SelectedLayers == 0 ) DisplayError( this, _( "No layer selected" ) ); } -void WinEDA_BasePcbFrame::ToPlotter( wxCommandEvent& event ) +void WinEDA_PcbFrame::ToPlotter( wxCommandEvent& event ) { - WinEDA_PlotFrame* frame = new WinEDA_PlotFrame( this ); + DIALOG_PLOT* frame = new DIALOG_PLOT( this ); frame->ShowModal(); frame->Destroy(); diff --git a/pcbnew/plotdxf.cpp b/pcbnew/plotdxf.cpp index 2da5961d53..d09430cf1e 100644 --- a/pcbnew/plotdxf.cpp +++ b/pcbnew/plotdxf.cpp @@ -12,23 +12,18 @@ #include "protos.h" -void WinEDA_BasePcbFrame::Genere_DXF( const wxString& FullFileName, int Layer, +bool WinEDA_BasePcbFrame::Genere_DXF( const wxString& FullFileName, int Layer, GRTraceMode trace_mode ) { Ki_PageDescr* currentsheet = GetScreen()->m_CurrentSheetDesc; - ClearMsgPanel(); - FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); if( output_file == NULL ) { - wxString msg = _( "Unable to create file " ) + FullFileName; - DisplayError( this, msg ); - return; + return false; } SetLocaleTo_C_standard(); - AppendMsgPanel( _( "File" ), FullFileName, CYAN ); DXF_PLOTTER* plotter = new DXF_PLOTTER(); plotter->set_paper_size( currentsheet ); @@ -44,4 +39,6 @@ void WinEDA_BasePcbFrame::Genere_DXF( const wxString& FullFileName, int Layer, plotter->end_plot(); delete plotter; SetLocaleTo_Default(); + + return true; } diff --git a/pcbnew/plotgerb.cpp b/pcbnew/plotgerb.cpp index 5b839547ca..ce2762aedd 100644 --- a/pcbnew/plotgerb.cpp +++ b/pcbnew/plotgerb.cpp @@ -21,7 +21,7 @@ #include "protos.h" /********************************************************************************/ -void WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer, +bool WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer, bool PlotOriginIsAuxAxis, GRTraceMode trace_mode ) /********************************************************************************/ @@ -33,9 +33,13 @@ void WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer * format 3.4 uses the native pcbnew units (1/10000 inch). */ { - wxPoint offset; + FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); + if( output_file == NULL ) + { + return false; + } - ClearMsgPanel(); + wxPoint offset; /* Calculate scaling from pcbnew units (in 0.1 mil or 0.0001 inch) to gerber units */ double scale = g_pcb_plot_options.Scale; @@ -48,14 +52,6 @@ void WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer offset.y = 0; } - FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); - if( output_file == NULL ) - { - wxString msg = _( "unable to create file " ) + FullFileName; - DisplayError( this, msg ); - return; - } - SetLocaleTo_C_standard(); PLOTTER* plotter = new GERBER_PLOTTER(); /* No mirror and scaling for gerbers! */ @@ -64,8 +60,6 @@ void WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer plotter->set_creator( wxT( "PCBNEW-RS274X" ) ); plotter->set_filename( FullFileName ); - AppendMsgPanel( _( "File" ), FullFileName, CYAN ); - plotter->start_plot( output_file ); // Sheet refs on gerber CAN be useful... and they're always 1:1 @@ -76,4 +70,6 @@ void WinEDA_BasePcbFrame::Genere_GERBER( const wxString& FullFileName, int Layer plotter->end_plot(); delete plotter; SetLocaleTo_Default(); + + return true; } diff --git a/pcbnew/plothpgl.cpp b/pcbnew/plothpgl.cpp index 939849079c..b6186163c9 100644 --- a/pcbnew/plothpgl.cpp +++ b/pcbnew/plothpgl.cpp @@ -13,7 +13,7 @@ #include "protos.h" -void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer, +bool WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer, GRTraceMode trace_mode ) { wxSize SheetSize; @@ -24,8 +24,11 @@ void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer, double scale; wxPoint offset; - ClearMsgPanel(); - + FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); + if( output_file == NULL ) + { + return false; + } // Compute pen_dim (from g_HPGL_Pen_Diam in mils) in pcb units, // with plot scale (if Scale is 2, pen diameter is always g_HPGL_Pen_Diam // so apparent pen diam is real pen diam / Scale @@ -40,16 +43,8 @@ void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer, int pen_recouvrement = wxRound( g_pcb_plot_options.HPGL_Pen_Recouvrement * 10.0 / g_pcb_plot_options.Scale ); - FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); - if( output_file == NULL ) - { - wxString msg = _( "Unable to create file " ) + FullFileName; - DisplayError( this, msg ); - return; - } SetLocaleTo_C_standard(); - AppendMsgPanel( _( "File" ), FullFileName, CYAN ); if( g_pcb_plot_options.PlotScaleOpt != 1 ) Center = TRUE; // Scale != 1 so center PCB plot. @@ -112,4 +107,6 @@ void WinEDA_BasePcbFrame::Genere_HPGL( const wxString& FullFileName, int Layer, plotter->end_plot(); delete plotter; SetLocaleTo_Default(); + + return true; } diff --git a/pcbnew/plotps.cpp b/pcbnew/plotps.cpp index 6672510ae7..34e515980c 100644 --- a/pcbnew/plotps.cpp +++ b/pcbnew/plotps.cpp @@ -16,7 +16,7 @@ /* Generate a PostScript file (*. ps) of the circuit layer. * If layer < 0: all layers are plotted. */ -void WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer, +bool WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer, bool useA4, GRTraceMode trace_mode ) { wxSize SheetSize; @@ -29,18 +29,13 @@ void WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer, Ki_PageDescr* SheetPS; wxPoint offset; - ClearMsgPanel(); - FILE* output_file = wxFopen( FullFileName, wxT( "wt" ) ); if( output_file == NULL ) { - wxString msg = _( "Unable to create file " ) + FullFileName; - DisplayError( this, msg ); - return; + return false; } SetLocaleTo_C_standard(); - AppendMsgPanel( _( "File" ), FullFileName, CYAN ); if( g_pcb_plot_options.PlotScaleOpt != 1 ) Center = TRUE; // Scale != 1 so center plot. @@ -131,4 +126,6 @@ void WinEDA_BasePcbFrame::Genere_PS( const wxString& FullFileName, int Layer, plotter->end_plot(); delete plotter; SetLocaleTo_Default(); + + return true; }