diff -ruN kicad.orig/eeschema/eeschema_scripted.cpp kicad/eeschema/eeschema_scripted.cpp --- kicad.orig/eeschema/eeschema_scripted.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kicad/eeschema/eeschema_scripted.cpp 2011-03-13 02:25:17.039706999 +0000 @@ -0,0 +1,236 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: eeschema_scripted.cpp +// Copyright: Werner Almesberger, Wolfgang Spraul +// Licence: GPL v2 or higher +///////////////////////////////////////////////////////////////////////////// + +#include "fctsys.h" +#include "appl_wxstruct.h" +#include "common.h" +#include "program.h" +#include "general.h" +#include "netlist.h" +#include "protos.h" +#include "gr_basic.h" +#include "plotps.h" +#include "wx/cmdline.h" +#include "dialog_build_BOM.h" +#include "dialog_SVG_print_base.h" +#include "dialog_erc.h" +#include "plotdxf.h" +#include "class_drawsheetpath.h" +#include "eeschema_scripted.h" + +EESCHEMA_SCRIPTED g_EESchemaScripted; + +static const wxCmdLineEntryDesc g_cmdLineDesc [] = +{ + { wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("displays help on the command line parameters"), + wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, + + { wxCMD_LINE_SWITCH, wxT("l"), wxT("list-sheets"), wxT("list schematics pages") }, + + { wxCMD_LINE_OPTION, wxT("p"), wxT("plot"), wxT("plots the board [ps|svg|dxf]"), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_SWITCH, wxT("plot-bw"), wxT("plot-bw"), wxT("plot: black & white (default: color)") }, + { wxCMD_LINE_SWITCH, wxT("plot-sheetref"), wxT("plot-sheetref"), wxT("plot: print sheet reference (default: off)") }, + + { wxCMD_LINE_SWITCH, wxT("b"), wxT("bom"), wxT("generate bill of materials (.bom)") }, + { wxCMD_LINE_SWITCH, wxT("e"), wxT("erc"), wxT("generate electric rules check (.erc) file") }, + { wxCMD_LINE_SWITCH, wxT("n"), wxT("netlist"), wxT("generate netlist (.net)") }, + { wxCMD_LINE_PARAM, 0, 0, wxT(""), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_NONE } +}; + +bool ScriptedDrawSVGPage( WinEDA_DrawFrame * frame, + const wxString& FullFileName, BASE_SCREEN* screen, + bool aPrintBlackAndWhite = false, + bool aPrint_Sheet_Ref = false); + +bool EESCHEMA_SCRIPTED::Run() +{ + wxFileName fn; + WinEDA_SchematicFrame* frame; + wxCommandEvent DummyCmd; + wxString str; + int i; + + WinEDA_App& app = wxGetApp(); + g_IsScripted = true; + wxLog::EnableLogging(false); // this should suppress some wx dialogs + app.InitEDA_Appl( wxT( "EESchema" ), APP_TYPE_EESCHEMA ); + + wxCmdLineParser parser; + parser.SetDesc(g_cmdLineDesc); + parser.SetCmdLine(app.argc, app.argv); + if (parser.Parse()) + return false; + + i = parser.Found( _("list-sheets") ) + + parser.Found( _("plot") ) + + parser.Found( _("bom") ) + + parser.Found( _("erc") ) + + parser.Found( _("netlist") ); + if ( !i ) + { + wxFprintf( stderr, wxT("One of --list-sheets --plot --bom --erc --netlist must be given.\n")); + return false; + } + if ( i > 1 ) + { + wxFprintf( stderr, wxT("Only one of --list-sheets --plot --bom --erc --netlist may be given at a time.\n")); + return false; + } + + // parse plotting parameters + enum PlotCommand { + PLOT_NONE, + PLOT_PS, + PLOT_SVG, + PLOT_DXF + } PlotCmd; + bool PlotBW; + bool PlotSheetRef; + + PlotCmd = PLOT_NONE; + if ( parser.Found( _("plot"), &str ) ) + { + if (!str.CmpNoCase( wxT("ps") ) ) + PlotCmd = PLOT_PS; + else if ( !str.CmpNoCase( wxT("svg") ) ) + PlotCmd = PLOT_SVG; + else if ( !str.CmpNoCase( wxT("dxf") ) ) + PlotCmd = PLOT_DXF; + else + { + wxFprintf( stderr, wxT("Unexpected plot format '%ls'.\n"), str.c_str()); + return false; + } + PlotBW = parser.Found( _("plot-bw") ); + PlotSheetRef = parser.Found( _("plot-sheetref") ); + } + + fn = parser.GetParam(); + if( fn.GetExt() != SchematicFileExtension ) + { + wxLogDebug( wxT( "eeschema file <%s> has the wrong extension. Changing extension to .sch." ), GetChars( fn.GetFullPath() ) ); + fn.SetExt( PcbFileExtension ); + } + if( !fn.FileExists()) + { + wxFprintf( stderr, wxT("%ls: file '%ls' does not exist.\n" ), app.argv[0], fn.GetFullPath().c_str() ); + return false; + } + wxSetWorkingDirectory( fn.GetPath() ); + + SeedLayers(); + frame = new WinEDA_SchematicFrame( NULL, wxT( "EESchema" ), + wxPoint( 0, 0 ), wxSize( 600, 400 ) ); + ActiveScreen = frame->GetScreen(); + app.SetTopWindow( frame ); +#if 0 // enable this to see more of the GUI + frame->Show( true ); +#endif + if( !frame->LoadOneEEProject( fn.GetFullPath(), false ) ) + { + wxFprintf( stderr, fn.GetFullPath() + _(": can't load\n") ); + return false; + } + + if ( parser.Found( wxT("list-sheets") ) ) // class_drawsheetpath.h + // dialog_SVG_print.cpp:DIALOG_SVG_PRINT:PrintSVGDoc() + { + SCH_SHEET_LIST SheetList( 0 /* aSheet */ ); + SCH_SHEET_PATH* sheetpath, *oldsheetpath; + SCH_SHEET_PATH list; + SCH_SCREEN* schscreen; + + oldsheetpath = frame->GetSheet(); + sheetpath = SheetList.GetFirst(); + while ( sheetpath ) + { + list.Clear(); + if ( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) ) + { + frame->m_CurrentSheet = &list; + frame->m_CurrentSheet->UpdateAllScreenReferences(); + frame->SetSheetNumberAndCount(); + schscreen = frame->m_CurrentSheet->LastScreen(); + ActiveScreen = schscreen; + + wxPrintf( sheetpath->Path() + _(" ") + + sheetpath->PathHumanReadable() + _(" ") + + sheetpath->Last()->GetFileName() + _(" ") + + frame->GetUniqueFilenameForCurrentSheet( ) + wxT( ".sch\n") ); + } + sheetpath = SheetList.GetNext(); + } + frame->m_CurrentSheet = oldsheetpath; + frame->m_CurrentSheet->UpdateAllScreenReferences(); + frame->SetSheetNumberAndCount(); + } + else if ( PlotCmd == PLOT_PS ) // plotps.cpp + { + // values must be idential to plotps.cpp:PageFormatReq + enum PageFormatReq { + PAGE_SIZE_AUTO, + PAGE_SIZE_A4, + PAGE_SIZE_A + }; + + WinEDA_PlotPSFrame* PlotPSFrame = new WinEDA_PlotPSFrame( frame ); + PlotPSFrame->m_Plot_Sheet_Ref->SetValue( PlotSheetRef ); + + // Strangely it seems that the plots come out right when 'A4' is + // selected, even if it's actually not A4 format. But when PAGE_SIZE_AUTO + // is selected, pages are cut off. Until we understand this better we + // always use A4. + PlotPSFrame->m_SizeOption->SetSelection( PAGE_SIZE_A4 ); + + PlotPSFrame->m_PlotPSColorOption->SetSelection( !PlotBW ); + PlotPSFrame->OnPlotPsAllExecuteClick( DummyCmd ); + delete PlotPSFrame; + } + else if ( PlotCmd == PLOT_SVG ) // dialog_SVG_print.cpp:DIALOG_SVG_PRINT::DrawSVGPage() + { + void ScriptedPrintSVGDoc( WinEDA_DrawFrame* frame, bool aPrintAll, bool aPrint_Sheet_Ref, bool aPrintBlackAndWhite ); + ScriptedPrintSVGDoc( frame, true /* aPrintAll */, PlotSheetRef, PlotBW ); + } + else if ( PlotCmd == PLOT_DXF ) // plotdxf.cpp:WinEDA_PlotDXFFrame::CreateDXFFile() + { + WinEDA_PlotDXFFrame* PlotDXFFrame = new WinEDA_PlotDXFFrame( frame ); + PlotDXFFrame->m_Plot_Sheet_Ref->SetValue( PlotSheetRef ); + PlotDXFFrame->m_PlotDXFColorOption->SetSelection( !PlotBW ); + PlotDXFFrame->OnPlotDXFAllExecuteClick( DummyCmd ); + delete PlotDXFFrame; + } + else if ( parser.Found( wxT("bom") ) ) // see build_BOM.cpp:DIALOG_BUILD_BOM::GenereListeOfItems() + { + DIALOG_BUILD_BOM* dlg = new DIALOG_BUILD_BOM( frame ); + + dlg->m_ListCmpbyRefItems->SetValue( true ); + dlg->m_AddFootprintField->SetValue( true ); + dlg->m_AddAllFields->SetValue( true ); + + fn = ActiveScreen->m_FileName; + fn.SetExt( wxT( "lst" ) ); + dlg->GenereListeOfItems( fn.GetFullPath(), false /* aIncludeSubComponents */ ); + delete dlg; + } + else if ( parser.Found( wxT("erc") ) ) // erc.cpp:DIALOG_ERC::TestErc() + { + DIALOG_ERC* dlg = new DIALOG_ERC( frame ); + dlg->m_WriteResultOpt->SetValue( true ); + dlg->TestErc( 0 /* messageList */ ); + delete dlg; + } + else if ( parser.Found( wxT("netlist") ) ) // netlist_control.cpp:WinEDA_SchematicFrame::CreateNetlist() + { + frame->BuildNetListBase(); + fn = ActiveScreen->m_FileName; + fn.SetExt( wxT( "net" ) ); + frame->WriteNetListFile( NET_TYPE_PCBNEW /* aFormat */, fn.GetFullPath(), false /* aUse_netnames - only used for Spice */ ); + } + return true; +} diff -ruN kicad.orig/eeschema/eeschema_scripted.h kicad/eeschema/eeschema_scripted.h --- kicad.orig/eeschema/eeschema_scripted.h 1970-01-01 00:00:00.000000000 +0000 +++ kicad/eeschema/eeschema_scripted.h 2011-01-02 13:10:04.267823004 +0000 @@ -0,0 +1,14 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: eeschema_scripted.h +// Copyright: Wolfgang Spraul +// Licence: GPL v3 or higher +///////////////////////////////////////////////////////////////////////////// + +class EESCHEMA_SCRIPTED +{ +public: + EESCHEMA_SCRIPTED() { } + bool Run(); +}; + +extern EESCHEMA_SCRIPTED g_EESchemaScripted; diff -ruN kicad.orig/pcbnew/pcbnew_scripted.cpp kicad/pcbnew/pcbnew_scripted.cpp --- kicad.orig/pcbnew/pcbnew_scripted.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kicad/pcbnew/pcbnew_scripted.cpp 2011-03-13 06:55:03.227707000 +0000 @@ -0,0 +1,552 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: pcbnew_scripted.cpp +// Copyright: Wolfgang Spraul +// Licence: GPL v3 or higher +///////////////////////////////////////////////////////////////////////////// + +#include "fctsys.h" +#include "appl_wxstruct.h" +#include "confirm.h" + +#include +#include +#include +#include +#include + +#include "common.h" +#include "pcbnew.h" +#include "wxPcbStruct.h" +#include "plot_common.h" +#include "gestfich.h" +#include "pcbplot.h" +#include "autorout.h" +#include "cell.h" +#include "worksheet.h" +#include "zones.h" +#include "drag.h" +#include "eda_dde.h" +#include "colors_selection.h" +#include "class_drawpanel.h" + +#include "id.h" + +#include "build_version.h" + +#include "protos.h" +#include "pcbnew_scripted.h" +#include "gendrill.h" +#include "dialog_gendrill.h" +#include "dialog_drc.h" +#include "printout_controler.h" + +extern int g_DrawDefaultLineThickness; + +static const wxCmdLineEntryDesc g_cmdLineDesc [] = +{ + { wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("displays help on the command line parameters"), + wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, + { wxCMD_LINE_SWITCH, wxT("d"), wxT("drill"), wxT("generates a .drl drill file") }, + { wxCMD_LINE_SWITCH, wxT("list-layers"), wxT("list-layers"), wxT("lists the names of all enabled layers in the .brd file") }, + { wxCMD_LINE_OPTION, wxT("p"), wxT("plot"), wxT("plots the board [hpgl|gerber|ps|ps_a4|dxf]"), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_OPTION, wxT("l"), wxT("layers"), wxT("comma separated list of layer names (default: all enabled layers)"), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_OPTION, wxT("ps-pads-drill-opt"), wxT("ps-pads-drill-opt"), wxT("Postscript pads drill option [none|small|real] (default:small)"), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_SWITCH, wxT("mirror"), wxT("mirror"), wxT("mirror plot (HPGL and Postscript only)") }, + { wxCMD_LINE_SWITCH, wxT("e"), wxT("exclude-pcb-edge"), wxT("exclude PCB edge (Gerber only)") }, + { wxCMD_LINE_SWITCH, wxT("fill-all-zones"), wxT("fill-all-zones"), wxT("fill zones before plotting") }, + { wxCMD_LINE_SWITCH, wxT("drc"), wxT("drc"), wxT("generates a design rule check report (.rpt)") }, + { wxCMD_LINE_SWITCH, wxT("svg"), wxT("svg"), wxT("plots the board in SVG format") }, + { wxCMD_LINE_SWITCH, wxT("svg-merge"), wxT("svg-merge-layers"), wxT("merge layers into one SVG file") }, + { wxCMD_LINE_SWITCH, wxT("svg-edge"), wxT("svg-board-edges"), wxT("add board edges to SVG plots") }, + { wxCMD_LINE_SWITCH, wxT("pos"), wxT("pos"), wxT("create front and back .pos component position files") }, + { wxCMD_LINE_SWITCH, wxT("bom"), wxT("bom"), wxT("create a .csv bom") }, + { wxCMD_LINE_SWITCH, wxT("cmp"), wxT("cmp"), wxT("recreate .cmp components file for CvPcb") }, + { wxCMD_LINE_SWITCH, wxT("vrml"), wxT("vrml"), wxT("generates a .wrl vrml board representation") }, + { wxCMD_LINE_PARAM, 0, 0, wxT(""), + wxCMD_LINE_VAL_STRING }, + { wxCMD_LINE_NONE } +}; + +bool Pcbnew_Scripted() +{ + wxFileName fn; + wxString str; + WinEDA_PcbFrame* frame = NULL; + wxCommandEvent dummy; + int i; + + WinEDA_App& app = wxGetApp(); + g_IsScripted = true; + wxLog::EnableLogging(false); // this should suppress some wx dialogs + app.InitEDA_Appl( wxT( "PCBnew" ), APP_TYPE_PCBNEW ); + + wxCmdLineParser parser; + parser.SetDesc(g_cmdLineDesc); + parser.SetCmdLine(app.argc, app.argv); + if (parser.Parse()) + return false; + if ( parser.Found( wxT("ps-pads-drill-opt"), &str ) + && str.CmpNoCase( wxT("none") ) + && str.CmpNoCase( wxT("small") ) + && str.CmpNoCase( wxT("real") )) + { + wxFprintf( stderr, wxT("Unexpected pads drill option '%ls'.\n"), str.c_str()); + return false; + } + i = parser.Found( _("drill") ) + + parser.Found( _("list-layers") ) + + parser.Found( _("plot") ) + + parser.Found( _("drc") ) + + parser.Found( _("svg") ) + + parser.Found( _("pos") ) + + parser.Found( _("bom") ) + + parser.Found( _("cmp") ) + + parser.Found( _("vrml") ); + if ( !i ) + { + wxFprintf( stderr, wxT("One of --drill --list-layers --plot --drc --svg --pos --bom --cmp --vrml must be given.\n")); + return false; + } + if ( i > 1 ) + { + wxFprintf( stderr, wxT("Only one of --drill --list-layers --plot --drc --svg --pos --bom --cmp --vrml may be given at a time.\n")); + return false; + } + + fn = parser.GetParam(); + if( fn.GetExt() != PcbFileExtension ) + { + wxLogDebug( wxT( "PcbNew file <%s> has the wrong extension. Changing extension to .brd." ), GetChars( fn.GetFullPath() ) ); + fn.SetExt( PcbFileExtension ); + } + if( !fn.FileExists()) + { + wxFprintf( stderr, wxT("%ls: file '%ls' does not exist.\n" ), app.argv[0], fn.GetFullPath().c_str() ); + return false; + } + wxSetWorkingDirectory( fn.GetPath() ); + + app.InitEDA_Appl( wxT( "PCBnew" ), APP_TYPE_PCBNEW ); + ScreenPcb = new PCB_SCREEN(); + ActiveScreen = ScreenPcb; + app.GetSettings( false /* reopenLastUsedDirectory */ ); + + g_DrawBgColor = BLACK; + frame = new WinEDA_PcbFrame( NULL, wxT( "PcbNew" ), wxPoint( 0, 0 ), wxSize( 600, 400 ) ); + app.SetTopWindow( frame ); + +#if 0 // enable this to see more of the GUI + frame->Show( true ); + frame->Zoom_Automatique( true ); +#endif + + frame->LoadOnePcbFile( fn.GetFullPath() ); + frame->LoadProjectSettings( fn.GetFullPath() ); + + if ( parser.Found( wxT("drill") ) ) + { + DIALOG_GENDRILL* drill_frame = new DIALOG_GENDRILL( frame ); + drill_frame->GenDrillFiles( dummy ); + delete drill_frame; + } + if ( parser.Found( wxT("list-layers") ) ) + { + for ( i = 0; i < NB_LAYERS; i++ ) + { + if( frame->GetBoard()->IsLayerEnabled( i ) ) + { + str = frame->GetBoard()->GetLayerName( i ); + str.Trim( true ); str.Trim( false ); // remove leading and trailing spaces if any + wxPrintf(str + _("\n")); + } + } + } + if ( parser.Found( wxT("plot"), &str ) ) // see pcbplot.cpp + { + bool ps_use_a4; + int plot_format; + wxString ext, layers_str; + + g_pcb_plot_options.PlotLine_Width = g_DrawDefaultLineThickness; + if (!str.CmpNoCase( wxT("ps") ) ) + { + plot_format = PLOT_FORMAT_POST; + ext = wxT( "ps" ); + ps_use_a4 = false; + } + else if ( !str.CmpNoCase( wxT("ps_a4") ) ) + { + plot_format = PLOT_FORMAT_POST; + ext = wxT( "ps" ); + ps_use_a4 = true; + } + else if ( !str.CmpNoCase( wxT("hpgl") ) ) + { + plot_format = PLOT_FORMAT_HPGL; + ext = wxT( "plt" ); + } + else if ( !str.CmpNoCase( wxT("gerber") ) ) + { + plot_format = PLOT_FORMAT_GERBER; + ext = wxT( "pho" ); + } + else if ( !str.CmpNoCase( wxT("dxf") ) ) + { + plot_format = PLOT_FORMAT_DXF; + ext = wxT( "dxf" ); + } + else + { + wxFprintf( stderr, wxT("Unexpected plot type '%ls'.\n"), str.c_str()); + return false; + } + + // --ps-pads-drill-opt + if ( plot_format == PLOT_FORMAT_POST && parser.Found( wxT("ps-pads-drill-opt"), &str ) ) + { + if (!str.CmpNoCase( wxT("none") ) ) + g_pcb_plot_options.DrillShapeOpt = PCB_Plot_Options::NO_DRILL_SHAPE; + else if ( !str.CmpNoCase( wxT("small") ) ) + g_pcb_plot_options.DrillShapeOpt = PCB_Plot_Options::SMALL_DRILL_SHAPE; + else if ( !str.CmpNoCase( wxT("real") ) ) + g_pcb_plot_options.DrillShapeOpt = PCB_Plot_Options::FULL_DRILL_SHAPE; + else + { + wxFprintf( stderr, wxT("Unexpected Postscript pads drill option '%ls'.\n"), str.c_str()); + return false; + } + } + + // --mirror + if ( parser.Found( wxT("mirror") ) ) + g_pcb_plot_options.PlotOrient = PLOT_MIROIR; + + // --exclude-pcb-edge + if ( parser.Found( wxT("exclude-pcb-edge") ) ) + g_pcb_plot_options.Exclude_Edges_Pcb = true; + + // --fill-all-zones + if ( parser.Found( wxT("fill-all-zones") ) ) + frame->Fill_All_Zones( false /* verbose */ ); + + parser.Found( wxT("layers"), &layers_str ); + wxStringTokenizer tokenizer( layers_str, _(",") ); + int layer_i = 0; + wxString layername; + while ( ( layers_str.IsEmpty() && layer_i < NB_LAYERS ) || tokenizer.HasMoreTokens() ) + { + if ( layers_str.IsEmpty() ) + { + if( !frame->GetBoard()->IsLayerEnabled( layer_i ) ) + { + layer_i++; + continue; + } + layername = frame->GetBoard()->GetLayerName( layer_i ); + layername.Trim( true ); layername.Trim( false ); // remove leading and trailing spaces if any + layer_i++; + } + else + { + layername = tokenizer.GetNextToken(); + for( layer_i = 0; layer_i < NB_LAYERS; layer_i++ ) + { + str = frame->GetBoard()->GetLayerName( layer_i ); + str.Trim( true ); str.Trim( false ); // remove leading and trailing spaces if any + if ( !str.Cmp( layername ) ) + break; + } + if (layer_i >= NB_LAYERS) + { + wxFprintf( stderr, _( "Unknown layer name '%ls'\n" ), layername.c_str() ); + continue; + } + } + fn = ScreenPcb->m_FileName; + fn.SetName( fn.GetName() + wxT( "-" ) + layername ); + + // Use Gerber Extensions based on layer number + // (See http://en.wikipedia.org/wiki/Gerber_File) + if( (plot_format == PLOT_FORMAT_GERBER) && true /* always use gerber extensions */ ) + { + switch( layer_i ) + { + case LAYER_N_FRONT: + fn.SetExt( wxT( "gtl" ) ); + break; + + case LAYER_N_2: + case LAYER_N_3: + case LAYER_N_4: + case LAYER_N_5: + case LAYER_N_6: + case LAYER_N_7: + case LAYER_N_8: + case LAYER_N_9: + case LAYER_N_10: + case LAYER_N_11: + case LAYER_N_12: + case LAYER_N_13: + case LAYER_N_14: + case LAYER_N_15: + + // 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; + + case LAYER_N_BACK: + fn.SetExt( wxT( "gbl" ) ); + break; + + case ADHESIVE_N_BACK: + fn.SetExt( wxT( "gba" ) ); + break; + + case ADHESIVE_N_FRONT: + fn.SetExt( wxT( "gta" ) ); + break; + + case SOLDERPASTE_N_BACK: + fn.SetExt( wxT( "gbp" ) ); + break; + + case SOLDERPASTE_N_FRONT: + fn.SetExt( wxT( "gtp" ) ); + break; + + case SILKSCREEN_N_BACK: + fn.SetExt( wxT( "gbo" ) ); + break; + + case SILKSCREEN_N_FRONT: + fn.SetExt( wxT( "gto" ) ); + break; + + case SOLDERMASK_N_BACK: + fn.SetExt( wxT( "gbs" ) ); + break; + + case SOLDERMASK_N_FRONT: + fn.SetExt( wxT( "gts" ) ); + break; + + case DRAW_N: + case COMMENT_N: + case ECO1_N: + case ECO2_N: + case EDGE_N: + default: + fn.SetExt( wxT( "gbr" ) ); + break; + } + } + else + { + fn.SetExt( ext ); + } + + bool success = false; + + switch( plot_format ) + { + case PLOT_FORMAT_POST: + success = frame->Genere_PS( fn.GetFullPath(), layer_i, ps_use_a4, + FILLED /* trace_mode */ ); + break; + + case PLOT_FORMAT_GERBER: + success = frame->Genere_GERBER( fn.GetFullPath(), layer_i, + false /* PlotOriginIsAuxAxis */, + FILLED /* trace_mode */ ); + break; + + case PLOT_FORMAT_HPGL: + success = frame->Genere_HPGL( fn.GetFullPath(), layer_i, + FILLED /* trace_mode */ ); + break; + + case PLOT_FORMAT_DXF: + success = frame->Genere_DXF( fn.GetFullPath(), layer_i, + FILLED /* trace_mode */ ); + break; + } + + // Print diags in messages box: + wxString msg; + if( !success ) + wxFprintf( stderr, _( "Unable to create <%s>\n" ), GetChars( fn.GetFullPath() ) ); + } + } + if ( parser.Found( wxT("drc") ) ) // drc_stuff.h drc.cpp dialog_drc.{h,cpp} + { + fn = ScreenPcb->m_FileName; + fn.SetExt( _("rpt") ); + + // if you get a segfault, try adding frame->m_drc->ShowDialog() to run through the GUI codepath + frame->m_drc->updatePointers(); + frame->m_drc->SetSettings(true, // Pad to pad DRC test enabled + true, // unconnected pdas DRC test enabled + true, // DRC test for zones enabled + fn.GetFullPath(), // report file name + true /* aSaveReport */ ); + frame->m_drc->m_pcb->m_Status_Pcb = 0; // Force full connectivity and ratsnest recalculations + frame->m_drc->RunTests(); + FILE* fp = wxFopen( fn.GetFullPath(), wxT( "w" ) ); + { // strings should match dialog_drc.cpp:DIALOG_DRC_CONTROL::writeReport() + int count; + + fprintf( fp, "** Drc report for %s **\n", + CONV_TO_UTF8( ScreenPcb->m_FileName ) ); + + wxDateTime now = wxDateTime::Now(); + fprintf( fp, "** Created on %s **\n", CONV_TO_UTF8( now.Format( wxT( "%F %T" ) ) ) ); + + class DRC_LIST_MARKERS* markers = new DRC_LIST_MARKERS( frame->m_drc->m_pcb ); + count = markers->GetCount(); + fprintf( fp, "\n** Found %d DRC errors **\n", count ); + for ( i = 0; i < count; i++ ) + fprintf( fp, "%s", CONV_TO_UTF8( markers->GetItem( i )->ShowReport()) ); + delete markers; + + class DRC_LIST_UNCONNECTED* unconnected = new DRC_LIST_UNCONNECTED( &frame->m_drc->m_unconnected ); + count = unconnected->GetCount(); + fprintf( fp, "\n** Found %d unconnected pads **\n", count ); + for ( i = 0; i < count; i++ ) + fprintf( fp, "%s", CONV_TO_UTF8( unconnected->GetItem( i )->ShowReport()) ); + delete unconnected; + + fprintf( fp, "\n** End of Report **\n" ); + } + fclose( fp ); + } + if ( parser.Found( wxT("svg") ) ) // see dialog_SVG_print.cpp:DIALOG_SVG_PRINT::DrawPage() + { + BASE_SCREEN* screen = frame->GetBaseScreen(); + wxSize SheetSize; // Sheet size in internal units + wxString layers_str; + PRINT_PARAMETERS print_params; + long PrintMaskLayer; + int layer_i; + wxSVGFileDC* dc; + + screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0; + screen->m_StartVisu.x = screen->m_StartVisu.y = 0; + SheetSize = screen->m_CurrentSheetDesc->m_Size; // size in 1/1000 inch + SheetSize.x *= frame->m_InternalUnits / 1000; + SheetSize.y *= frame->m_InternalUnits / 1000; // size in pixels + screen->SetScalingFactor( 1.0 ); + screen->m_IsPrinting = true; + float dpi = (float)frame->m_InternalUnits; + + frame->DrawPanel->m_ClipBox.SetX( 0 ); + frame->DrawPanel->m_ClipBox.SetY( 0 ); + frame->DrawPanel->m_ClipBox.SetWidth( 0x7FFFFF0 ); + frame->DrawPanel->m_ClipBox.SetHeight( 0x7FFFFF0 ); + + print_params.m_DrillShapeOpt = PRINT_PARAMETERS::FULL_DRILL_SHAPE; + print_params.m_Print_Sheet_Ref = false; // reference in bottom-right corner + + SetLocaleTo_C_standard(); // Switch the locale to standard C (needed + // to print floating point numbers like 1.3) + int bg_color = g_DrawBgColor; + g_DrawBgColor = WHITE; + + PrintMaskLayer = 0; + if ( parser.Found( wxT("layers"), &layers_str ) ) + { + wxStringTokenizer tokenizer( layers_str, _(",") ); + layer_i = 0; + wxString layername; + while ( tokenizer.HasMoreTokens() ) + { + layername = tokenizer.GetNextToken(); + for( layer_i = 0; layer_i < NB_LAYERS; layer_i++ ) + { + str = frame->GetBoard()->GetLayerName( layer_i ); + str.Trim( true ); str.Trim( false ); // remove leading and trailing spaces if any + if ( !str.Cmp( layername ) ) + break; + } + if (layer_i >= NB_LAYERS) + { + wxFprintf( stderr, _( "Unknown layer name '%ls'\n" ), layername.c_str() ); + continue; + } + PrintMaskLayer |= 1 << layer_i; + } + } + else + { + for ( layer_i = 0; layer_i < NB_LAYERS; layer_i++ ) + { + if ( frame->GetBoard()->IsLayerEnabled( layer_i ) ) + PrintMaskLayer |= 1 << layer_i; + } + } + + bool SvgMergeLayers = parser.Found( wxT("svg-merge-layers") ); + bool SvgEdgeLayer = parser.Found( wxT("svg-board-edges") ); + + for ( layer_i = 0; layer_i < NB_LAYERS; layer_i++ ) + { + long LayerMask; + + fn = ScreenPcb->m_FileName; + fn.SetExt( _("svg") ); + if ( SvgMergeLayers ) + { + fn.SetName( fn.GetName() + wxT( "-brd" ) ); + LayerMask = PrintMaskLayer; + } + else + { + if ( !(PrintMaskLayer & (1 << layer_i) )) + continue; + str = frame->GetBoard()->GetLayerName( layer_i ); + str.Trim( true ); str.Trim( false ); // remove leading and trailing spaces if any + fn.SetName( fn.GetName() + wxT( "-" ) + str ); + LayerMask = 1 << layer_i; + } + if ( SvgEdgeLayer ) + LayerMask |= EDGE_LAYER; + + dc = new wxSVGFileDC( fn.GetFullPath(), SheetSize.x, SheetSize.y, dpi ); + GRResetPenAndBrush( dc ); + frame->PrintPage( dc, false /* aPrint_Frame_Ref */, LayerMask, false /* aPrintMirrorMode */, &print_params); + delete dc; + dc = 0; + + if ( SvgMergeLayers ) + break; + } + g_DrawBgColor = bg_color; + SetLocaleTo_Default(); // revert to the current locale + screen->m_IsPrinting = false; + } + + if ( parser.Found( wxT("pos") ) ) // see gen_modules_placefile.cpp:WinEDA_PcbFrame::GenModulesPosition() + frame->GenModulesPosition( dummy ); + + if ( parser.Found( wxT("bom") ) ) // see build_BOM_from_board.cpp:WinEDA_PcbFrame::RecreateBOMFileFromBoard() + frame->RecreateBOMFileFromBoard( dummy ); + + if ( parser.Found( wxT("cmp") ) ) // see xchgmod.cpp:WinEDA_PcbFrame::RecreateCmpFileFromBoard() + frame->RecreateCmpFileFromBoard( dummy ); + + if ( parser.Found( wxT("vrml") ) ) // see export_vrml.cpp:WinEDA_PcbFrame::OnExportVRML() + { + wxString subDirFor3Dshapes( _( "shapes3D" ) ); + + fn = ScreenPcb->m_FileName; + fn.SetExt( _("wrl") ); + if( ! wxDirExists( subDirFor3Dshapes ) ) + wxMkdir( subDirFor3Dshapes ); + frame->ExportVRML_File( fn.GetFullPath(), 1.0 /* aScale */, true /* aExport3DFile */, subDirFor3Dshapes ); + } + return true; +} diff -ruN kicad.orig/pcbnew/pcbnew_scripted.h kicad/pcbnew/pcbnew_scripted.h --- kicad.orig/pcbnew/pcbnew_scripted.h 1970-01-01 00:00:00.000000000 +0000 +++ kicad/pcbnew/pcbnew_scripted.h 2011-01-02 13:10:04.267823004 +0000 @@ -0,0 +1,7 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: pcbnew_scripted.h +// Copyright: Wolfgang Spraul +// Licence: GPL v3 or higher +///////////////////////////////////////////////////////////////////////////// + +bool Pcbnew_Scripted();