diff --git a/demos/python_scripts_examples/gen_gerber_and_drill_files_board.py b/demos/python_scripts_examples/gen_gerber_and_drill_files_board.py index af8935c35b..30f56bc057 100644 --- a/demos/python_scripts_examples/gen_gerber_and_drill_files_board.py +++ b/demos/python_scripts_examples/gen_gerber_and_drill_files_board.py @@ -21,6 +21,7 @@ ''' import sys +import os from pcbnew import * filename=sys.argv[1] @@ -29,20 +30,25 @@ board = LoadBoard(filename) plotDir = "plot/" +#prepare the gerber job file +gen_job_file=True + pctl = PLOT_CONTROLLER(board) popt = pctl.GetPlotOptions() popt.SetOutputDirectory(plotDir) -# Set some important plot options: +# Set some important plot options (see pcb_plot_params.h): popt.SetPlotFrameRef(False) #do not change it -popt.SetLineWidth(FromMM(0.15)) # default line width to plot items having no line thickiness defined +popt.SetLineWidth(FromMM(0.35)) popt.SetAutoScale(False) #do not change it popt.SetScale(1) #do not change it popt.SetMirror(False) popt.SetUseGerberAttributes(True) +popt.SetIncludeGerberNetlistInfo(True) +popt.SetCreateGerberJobFile(gen_job_file) popt.SetUseGerberProtelExtensions(False) popt.SetExcludeEdgeLayer(False); popt.SetScale(1) @@ -57,6 +63,9 @@ popt.SetDrillMarksType( PCB_PLOT_PARAMS.NO_DRILL_SHAPE ); popt.SetSkipPlotNPTH_Pads( False ); +#prepare the gerber job file +jobfile_writer = GERBER_JOBFILE_WRITER( board ) + # Once the defaults are set it become pretty easy... # I have a Turing-complete programming language here: I'll use it... # param 0 is a string added to the file base name to identify the drawing @@ -84,6 +93,8 @@ for layer_info in plot_plan: pctl.SetLayer(layer_info[1]) pctl.OpenPlotfile(layer_info[0], PLOT_FORMAT_GERBER, layer_info[2]) print 'plot %s' % pctl.GetPlotFileName() + if gen_job_file == True: + jobfile_writer.AddGbrFile( layer_info[1], os.path.basename(pctl.GetPlotFileName()) ); if pctl.PlotLayer() == False: print "plot error" @@ -129,3 +140,11 @@ drlwriter.CreateDrillandMapFilesSet( pctl.GetPlotDirName(), genDrl, genMap ); rptfn = pctl.GetPlotDirName() + 'drill_report.rpt' print 'report: %s' % rptfn drlwriter.GenDrillReportFile( rptfn ); + +if gen_job_file == True: + #job_fn=os.path.splitext(pctl.GetPlotFileName())[0] + '.gbrjob' + job_fn=os.path.dirname(pctl.GetPlotFileName()) + '/' + os.path.basename(filename) + job_fn=os.path.splitext(job_fn)[0] + '.gbrjob' + print 'create job file %s' % job_fn + jobfile_writer.CreateJobFile( job_fn ) + diff --git a/pcbnew/python/examples/gen_gerber_and_drill_files_board.py b/pcbnew/python/examples/gen_gerber_and_drill_files_board.py deleted file mode 100644 index 30f56bc057..0000000000 --- a/pcbnew/python/examples/gen_gerber_and_drill_files_board.py +++ /dev/null @@ -1,150 +0,0 @@ -''' - A python script example to create plot files to build a board: - Gerber files - Drill files - Map dril files - - Important note: - this python script does not plot frame references (page layout). - the reason is it is not yet possible from a python script because plotting - plot frame references needs loading the corresponding page layout file - (.wks file) or the default template. - - This info (the page layout template) is not stored in the board, and therefore - not available. - - Do not try to change SetPlotFrameRef(False) to SetPlotFrameRef(true) - the result is the pcbnew lib will crash if you try to plot - the unknown frame references template. - - Anyway, in gerber and drill files the page layout is not plot -''' - -import sys -import os - -from pcbnew import * -filename=sys.argv[1] - -board = LoadBoard(filename) - -plotDir = "plot/" - -#prepare the gerber job file -gen_job_file=True - -pctl = PLOT_CONTROLLER(board) - -popt = pctl.GetPlotOptions() - -popt.SetOutputDirectory(plotDir) - -# Set some important plot options (see pcb_plot_params.h): -popt.SetPlotFrameRef(False) #do not change it -popt.SetLineWidth(FromMM(0.35)) - -popt.SetAutoScale(False) #do not change it -popt.SetScale(1) #do not change it -popt.SetMirror(False) -popt.SetUseGerberAttributes(True) -popt.SetIncludeGerberNetlistInfo(True) -popt.SetCreateGerberJobFile(gen_job_file) -popt.SetUseGerberProtelExtensions(False) -popt.SetExcludeEdgeLayer(False); -popt.SetScale(1) -popt.SetUseAuxOrigin(True) - -# This by gerbers only -popt.SetSubtractMaskFromSilk(False) -# Disable plot pad holes -popt.SetDrillMarksType( PCB_PLOT_PARAMS.NO_DRILL_SHAPE ); -# Skip plot pad NPTH when possible: when drill size and shape == pad size and shape -# usually sel to True for copper layers -popt.SetSkipPlotNPTH_Pads( False ); - - -#prepare the gerber job file -jobfile_writer = GERBER_JOBFILE_WRITER( board ) - -# Once the defaults are set it become pretty easy... -# I have a Turing-complete programming language here: I'll use it... -# param 0 is a string added to the file base name to identify the drawing -# param 1 is the layer ID -# param 2 is a comment -plot_plan = [ - ( "CuTop", F_Cu, "Top layer" ), - ( "CuBottom", B_Cu, "Bottom layer" ), - ( "PasteBottom", B_Paste, "Paste Bottom" ), - ( "PasteTop", F_Paste, "Paste top" ), - ( "SilkTop", F_SilkS, "Silk top" ), - ( "SilkBottom", B_SilkS, "Silk top" ), - ( "MaskBottom", B_Mask, "Mask bottom" ), - ( "MaskTop", F_Mask, "Mask top" ), - ( "EdgeCuts", Edge_Cuts, "Edges" ), -] - - -for layer_info in plot_plan: - if layer_info[1] <= B_Cu: - popt.SetSkipPlotNPTH_Pads( True ) - else: - popt.SetSkipPlotNPTH_Pads( False ) - - pctl.SetLayer(layer_info[1]) - pctl.OpenPlotfile(layer_info[0], PLOT_FORMAT_GERBER, layer_info[2]) - print 'plot %s' % pctl.GetPlotFileName() - if gen_job_file == True: - jobfile_writer.AddGbrFile( layer_info[1], os.path.basename(pctl.GetPlotFileName()) ); - if pctl.PlotLayer() == False: - print "plot error" - -#generate internal copper layers, if any -lyrcnt = board.GetCopperLayerCount(); - -for innerlyr in range ( 1, lyrcnt-1 ): - popt.SetSkipPlotNPTH_Pads( True ); - pctl.SetLayer(innerlyr) - lyrname = 'inner%s' % innerlyr - pctl.OpenPlotfile(lyrname, PLOT_FORMAT_GERBER, "inner") - print 'plot %s' % pctl.GetPlotFileName() - if pctl.PlotLayer() == False: - print "plot error" - - -# At the end you have to close the last plot, otherwise you don't know when -# the object will be recycled! -pctl.ClosePlot() - -# Fabricators need drill files. -# sometimes a drill map file is asked (for verification purpose) -drlwriter = EXCELLON_WRITER( board ) -drlwriter.SetMapFileFormat( PLOT_FORMAT_PDF ) - -mirror = False -minimalHeader = False -offset = wxPoint(0,0) -# False to generate 2 separate drill files (one for plated holes, one for non plated holes) -# True to generate only one drill file -mergeNPTH = False -drlwriter.SetOptions( mirror, minimalHeader, offset, mergeNPTH ) - -metricFmt = True -drlwriter.SetFormat( metricFmt ) - -genDrl = True -genMap = True -print 'create drill and map files in %s' % pctl.GetPlotDirName() -drlwriter.CreateDrillandMapFilesSet( pctl.GetPlotDirName(), genDrl, genMap ); - -# One can create a text file to report drill statistics -rptfn = pctl.GetPlotDirName() + 'drill_report.rpt' -print 'report: %s' % rptfn -drlwriter.GenDrillReportFile( rptfn ); - -if gen_job_file == True: - #job_fn=os.path.splitext(pctl.GetPlotFileName())[0] + '.gbrjob' - job_fn=os.path.dirname(pctl.GetPlotFileName()) + '/' + os.path.basename(filename) - job_fn=os.path.splitext(job_fn)[0] + '.gbrjob' - print 'create job file %s' % job_fn - jobfile_writer.CreateJobFile( job_fn ) -