diff --git a/scripting/plugins/OutputGeneration/FabOutputs.py b/scripting/plugins/OutputGeneration/FabOutputs.py index c7c334d..55d9d39 100644 --- a/scripting/plugins/OutputGeneration/FabOutputs.py +++ b/scripting/plugins/OutputGeneration/FabOutputs.py @@ -84,104 +84,108 @@ class FabOutputs(pcbnew.ActionPlugin): "soldermask defined": None, # TODO: how do I want to determine this? } - with zipfile.ZipFile(dir_fab / f"{project_name}{suffix}.zip", "w") as z: + files_fab = [] + files_asy = [] - # ================ - # Gerbers - # ================ + # ================ + # Gerbers + # ================ - plot_controller = pcbnew.PLOT_CONTROLLER(pcb) - plot_options = plot_controller.GetPlotOptions() - - # Set General Options: - plot_options.SetOutputDirectory(dir_fab) - plot_options.SetPlotFrameRef(False) - plot_options.SetPlotValue(False) - plot_options.SetPlotReference(True) - plot_options.SetPlotInvisibleText(False) - plot_options.SetPlotViaOnMaskLayer(False) - plot_options.SetExcludeEdgeLayer(True) - plot_options.SetUseAuxOrigin(False) - plot_options.SetMirror(False) - plot_options.SetNegative(False) - #plot_options.SetDrillMarksType(PLOT_DRILL_MARKS_TYPE) - #plot_options.SetScale(PLOT_SCALE) - plot_options.SetAutoScale(True) - #plot_options.SetPlotMode(PLOT_MODE) - #plot_options.SetLineWidth(pcbnew.FromMM(PLOT_LINE_WIDTH)) - plot_options.SetUseGerberAttributes(True) - plot_options.SetUseGerberProtelExtensions(False) - plot_options.SetCreateGerberJobFile(False) - plot_options.SetSubtractMaskFromSilk(True) - plot_options.SetIncludeGerberNetlistInfo(False) + plot_controller = pcbnew.PLOT_CONTROLLER(pcb) + plot_options = plot_controller.GetPlotOptions() + + # Set General Options: + plot_options.SetOutputDirectory(dir_fab) + plot_options.SetPlotFrameRef(False) + plot_options.SetPlotValue(False) + plot_options.SetPlotReference(True) + plot_options.SetPlotInvisibleText(False) + plot_options.SetPlotViaOnMaskLayer(False) + plot_options.SetExcludeEdgeLayer(True) + plot_options.SetUseAuxOrigin(False) + plot_options.SetMirror(False) + plot_options.SetNegative(False) + #plot_options.SetDrillMarksType(PLOT_DRILL_MARKS_TYPE) + #plot_options.SetScale(PLOT_SCALE) + plot_options.SetAutoScale(True) + #plot_options.SetPlotMode(PLOT_MODE) + #plot_options.SetLineWidth(pcbnew.FromMM(PLOT_LINE_WIDTH)) + plot_options.SetUseGerberAttributes(True) + plot_options.SetUseGerberProtelExtensions(False) + plot_options.SetCreateGerberJobFile(False) + plot_options.SetSubtractMaskFromSilk(True) + plot_options.SetIncludeGerberNetlistInfo(False) + + + plot_plan = [ + # ( layer ID, file extension, description) + ( pcbnew.F_Paste, 'gtp', 'Front Paste' ), + ( pcbnew.F_SilkS, 'gto', 'Front SilkScreen' ), + ( pcbnew.F_Mask, 'gts', 'Front Mask' ), + ( pcbnew.F_Cu, 'gtl', 'Front Copper' ), + *[(layer, f'g{layer}', f'Inner Layer {layer} Copper') for layer in range(1, layer_count-1)], + ( pcbnew.B_Cu, 'gbl', 'Back Copper' ), + ( pcbnew.B_Mask, 'gbs', 'Back Mask' ), + ( pcbnew.B_SilkS, 'gbo', 'Back SilkScreen' ), + ( pcbnew.B_Paste, 'gbp', 'Back Paste' ), + ( pcbnew.Edge_Cuts, 'gm1', 'Edges Cuts' ), + ] + + + for layer_info in plot_plan: + plot_controller.SetLayer(layer_info[0]) + plot_controller.OpenPlotfile('', pcbnew.PLOT_FORMAT_GERBER, layer_info[2]) + plot_controller.PlotLayer() + + fname = f"{project_name}{suffix}.{layer_info[1]}" + os.rename(dir_fab / f"{project_name}.gbr", dir_fab / fname) + files_fab.append(fname) + plot_controller.ClosePlot() - plot_plan = [ - # ( layer ID, file extension, description) - ( pcbnew.F_Paste, 'gtp', 'Front Paste' ), - ( pcbnew.F_SilkS, 'gto', 'Front SilkScreen' ), - ( pcbnew.F_Mask, 'gts', 'Front Mask' ), - ( pcbnew.F_Cu, 'gtl', 'Front Copper' ), - *[(layer, f'g{layer}', f'Inner Layer {layer} Copper') for layer in range(1, layer_count-1)], - ( pcbnew.B_Cu, 'gbl', 'Back Copper' ), - ( pcbnew.B_Mask, 'gbs', 'Back Mask' ), - ( pcbnew.B_SilkS, 'gbo', 'Back SilkScreen' ), - ( pcbnew.B_Paste, 'gbp', 'Back Paste' ), - ( pcbnew.Edge_Cuts, 'gm1', 'Edges Cuts' ), - ] + # ================ + # Drill Files + # ================ + METRIC = True + ZERO_FORMAT = pcbnew.GENDRILL_WRITER_BASE.DECIMAL_FORMAT + INTEGER_DIGITS = 3 + MANTISSA_DIGITS = 3 + MIRROR_Y_AXIS = False + HEADER = True + OFFSET = pcbnew.wxPoint(0,0) + MERGE_PTH_NPTH = True + DRILL_FILE = True + MAP_FILE = False + REPORTER = None - for layer_info in plot_plan: - plot_controller.SetLayer(layer_info[0]) - plot_controller.OpenPlotfile('', pcbnew.PLOT_FORMAT_GERBER, layer_info[2]) - plot_controller.PlotLayer() + drill_writer = pcbnew.EXCELLON_WRITER(pcb) + drill_writer.SetFormat(METRIC, ZERO_FORMAT, INTEGER_DIGITS, MANTISSA_DIGITS) + drill_writer.SetOptions(MIRROR_Y_AXIS, HEADER, OFFSET, MERGE_PTH_NPTH) + drill_writer.CreateDrillandMapFilesSet(str(dir_fab), DRILL_FILE, MAP_FILE, REPORTER) - os.rename(dir_fab / f"{project_name}.gbr", dir_fab / f"{project_name}{suffix}.{layer_info[1]}") - z.write(dir_fab / f"{project_name}{suffix}.{layer_info[1]}", arcname=f"{project_name}{suffix}.{layer_info[1]}") - - plot_controller.ClosePlot() + fname = f"{project_name}{suffix}.drl" + os.rename(dir_fab / f"{project_name}.drl", dir_fab / fname) + files_fab.append(fname) - # ================ - # Drill Files - # ================ - - METRIC = True - ZERO_FORMAT = pcbnew.GENDRILL_WRITER_BASE.DECIMAL_FORMAT - INTEGER_DIGITS = 3 - MANTISSA_DIGITS = 3 - MIRROR_Y_AXIS = False - HEADER = True - OFFSET = pcbnew.wxPoint(0,0) - MERGE_PTH_NPTH = True - DRILL_FILE = True - MAP_FILE = False - REPORTER = None - - drill_writer = pcbnew.EXCELLON_WRITER(pcb) - drill_writer.SetFormat(METRIC, ZERO_FORMAT, INTEGER_DIGITS, MANTISSA_DIGITS) - drill_writer.SetOptions(MIRROR_Y_AXIS, HEADER, OFFSET, MERGE_PTH_NPTH) - drill_writer.CreateDrillandMapFilesSet(str(dir_fab), DRILL_FILE, MAP_FILE, REPORTER) - - os.rename(dir_fab / f"{project_name}.drl", dir_fab / f"{project_name}{suffix}.drl") - z.write(dir_fab / f"{project_name}{suffix}.drl", arcname=f"{project_name}{suffix}.drl") - - # ================ - # Fab Drawing - # ================ - - with open(dir_fab / f"README_FABRICATION{suffix}.TXT", "w") as f: - f.write(f"{project_name}-REV{rev}\n") - f.write(f"Layer Order\n") - # for layer in plot_plan: - - z.write(dir_fab / f"README_FABRICATION{suffix}.TXT", arcname=f"README_FABRICATION{suffix}.TXT") - # ================ # Pick and Place # ================s # TODO + + # ================ + # Fab Drawing + # ================ + + fname = f"README_FABRICATION{suffix}.TXT" + with open(dir_fab / fname, "w") as f: + f.write(f"{project_name}-REV{rev}\n") + f.write(f"Layer Order\n") + # for layer in plot_plan: + files_fab.append(fname) + # ================ # Assembly Drawing # ================ @@ -189,4 +193,27 @@ class FabOutputs(pcbnew.ActionPlugin): with open(dir_asy / f"README_ASSEMBLY{suffix}.TXT", "w") as f: f.write(f"{project_name}-REV{rev}\n") f.write(f"Layer Order\n") - # for layer in plot_plan: \ No newline at end of file + # for layer in plot_plan: + + + # ================ + # Zip + # ================ + + with zipfile.ZipFile(dir_fab / f"{project_name}{suffix}_fabrication.zip", "w") as z: + for fname in files_fab: + z.write(dir_fab / fname, arcname=fname) + + with zipfile.ZipFile(dir_asy / f"{project_name}{suffix}_assembly.zip", "w") as z: + for fname in files_fab: + z.write(dir_fab / fname, arcname=Path("fabrication") / fname) + for fname in files_asy: + z.write(dir_asy / fname, arcname=fname) + + # dir_archive = dir_pcb / "Archive" + # with zipfile.ZipFile(dir_archive / f"{project_name}{suffix}_archive.zip", "w") as z: + # for fname in files_fab: + # z.write(dir_fab / fname, arcname=Path("fabrication") / fname) + # for fname in files_asy: + # z.write(dir_asy / fname, arcname=Path("assembly") / fname) + # # TODO: archive project here \ No newline at end of file