From aefd0879c32de562603042d5a3ab68cc2a7e213f Mon Sep 17 00:00:00 2001 From: sirlilpanda Date: Wed, 18 Feb 2026 17:37:22 +1300 Subject: [PATCH] updated kicad project to allow the parsing of raw args --- .hooks/kicad_cli_tools.py | 43 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/.hooks/kicad_cli_tools.py b/.hooks/kicad_cli_tools.py index c7ab624..36e9783 100644 --- a/.hooks/kicad_cli_tools.py +++ b/.hooks/kicad_cli_tools.py @@ -37,11 +37,11 @@ class OutputReportType(Enum): REPORT = 2 def get_file_extension(self) -> str: - if (self == OutputReportType.JSON): - return "json" - if (self == OutputReportType.REPORT): - return "rpt" - return "txt" + match self: + case OutputReportType.JSON: return "json" + case OutputReportType.REPORT: return "rpt" + # dont trust it + case _: return "txt" # this is a thin vale on the kicad cli tool class KicadProject: @@ -56,14 +56,15 @@ class KicadProject: def erc_check( self, report_format : OutputReportType = OutputReportType.JSON, - return_report : bool = False + return_report : bool = False, + additional_args : str = "" ) -> None | dict | str: format_type = report_format.name.lower() - pcb_file_path = self.project_path / f"{self.project_name}.kicad_sch" + sch_file_path = self.project_path / f"{self.project_name}.kicad_sch" erc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_ERC_REPORT_NAME}.{report_format.get_file_extension()}" retcode = subprocess.call( - f'{KICAD_CLI_PATH} sch erc {pcb_file_path} --output {erc_report_path} --format {format_type}', + f'{KICAD_CLI_PATH} sch erc {sch_file_path} --output {erc_report_path} --format {format_type} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -84,14 +85,15 @@ class KicadProject: def drc_check( self, report_format : OutputReportType = OutputReportType.JSON, - return_report : bool = False + return_report : bool = False, + additional_args : str = "" ) -> None | dict | str: format_type = report_format.name.lower() pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" drc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_DRC_REPORT_NAME}.{report_format.get_file_extension()}" print(f"{format_type=}, {drc_report_path=}") retcode = subprocess.call( - f'{KICAD_CLI_PATH} pcb drc {pcb_file_path} --output {drc_report_path} --format {format_type}', + f'{KICAD_CLI_PATH} pcb drc {pcb_file_path} --output {drc_report_path} --format {format_type} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -111,12 +113,13 @@ class KicadProject: def process_bom( self, - return_csv : bool = False + return_csv : bool = False, + additional_args : str = "" ) -> None | list[list[str]]: sch_file_path = self.project_path / f"{self.project_name}.kicad_sch" bom_output_path = Path(BOM_OUTPUT_PATH) / f"{self.project_name}{BOM_REPORT_NAME}.csv" retcode = subprocess.call( - f'{KICAD_CLI_PATH} sch export bom {sch_file_path} --output {bom_output_path}', + f'{KICAD_CLI_PATH} sch export bom {sch_file_path} --output {bom_output_path} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -139,6 +142,7 @@ class KicadProject: background : str = "default", preset : str = "follow_pcb_editor", zoom : int = 2, + additional_args : str = "" ) -> None: """ image_typ = "png" | "jpg" @@ -148,7 +152,7 @@ class KicadProject: pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" render_output_path = Path(PCB_IMAGE_OUTPUT_PATH) / f"{self.project_name}_render.{image_type}" retcode = subprocess.call( - f'{KICAD_CLI_PATH} pcb render {pcb_file_path} --output {render_output_path} --preset {preset} --zoom {zoom} ', + f'{KICAD_CLI_PATH} pcb render {pcb_file_path} --output {render_output_path} --preset {preset} --zoom {zoom} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -160,11 +164,11 @@ class KicadProject: self.created_files.append(render_output_path) # i am not giving you the pdf to output if you want to do that yourself go ahead - def create_schmatic_pdf(self) -> None: + def create_schmatic_pdf(self, additional_args="") -> None: sch_file_path = self.project_path / f"{self.project_name}.kicad_sch" sch_report_path = Path(SCHEMATIC_OUTPUT_PATH) / f"{self.project_name}{SCHEMATIC_FILE_SUFFIX}.pdf" retcode = subprocess.call( - f'{KICAD_CLI_PATH} sch export pdf {sch_file_path} --output {sch_report_path}', + f'{KICAD_CLI_PATH} sch export pdf {sch_file_path} --output {sch_report_path} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -175,11 +179,12 @@ class KicadProject: self.created_files.append(sch_report_path) - def create_pcb_pdf(self, layers : list[str] = ["F.Cu", "B.Cu"]) -> None: + + def create_pcb_pdf(self, layers : list[str] = ["F.Cu", "B.Cu"], additional_args : str = "") -> None: pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb" pcb_report_path = Path(PCB_PDF_OUTPUT_PATH) / f"{self.project_name}{PCB_PDF_FILE_SUFFIX}.pdf" retcode = subprocess.call( - f'{KICAD_CLI_PATH} pcb export pdf {pcb_file_path} --output {pcb_report_path} --layers {",".join(layers)}', + f'{KICAD_CLI_PATH} pcb export pdf {pcb_file_path} --output {pcb_report_path} --layers {",".join(layers)} {additional_args}', shell=True, stdout=KICAD_CLI_STDOUT ) @@ -201,8 +206,8 @@ def main() -> None: # find all kicad project files to operate on for path in Path(".").rglob('*.kicad_pro'): k = KicadProject(path) - k.drc_check(report_format= OutputReportType.REPORT) - k.erc_check(report_format= OutputReportType.REPORT) + k.drc_check(report_format = OutputReportType.REPORT) + k.erc_check(report_format = OutputReportType.REPORT) k.process_bom() k.create_schmatic_pdf() k.get_image()