From 33eb4af6b18e22ecc38f9a5cf6ce880eb3ee2fca Mon Sep 17 00:00:00 2001 From: Matthew Spotten <48339420+MattSpot10@users.noreply.github.com> Date: Wed, 12 Feb 2025 22:48:09 -0700 Subject: [PATCH] added support for handling sub-symbols added support for handling sub-symbols or symbols with multiple units. Currently only supports Kicad version 6 --- easyeda2kicad/__main__.py | 26 +++++++++++++ easyeda2kicad/easyeda/easyeda_importer.py | 4 +- easyeda2kicad/helpers.py | 47 +++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/easyeda2kicad/__main__.py b/easyeda2kicad/__main__.py index fc45aea..07d411b 100644 --- a/easyeda2kicad/__main__.py +++ b/easyeda2kicad/__main__.py @@ -21,6 +21,7 @@ id_already_in_symbol_lib, set_logger, update_component_in_symbol_lib_file, + add_sub_components_in_symbol_lib_file, ) from easyeda2kicad.kicad.export_kicad_3d_model import Exporter3dModelKicad from easyeda2kicad.kicad.export_kicad_footprint import ExporterFootprintKicad @@ -259,6 +260,13 @@ def main(argv: List[str] = sys.argv[1:]) -> int: importer = EasyedaSymbolImporter(easyeda_cp_cad_data=cad_data) easyeda_symbol: EeSymbol = importer.get_symbol() # print(easyeda_symbol) + + #adding support for importing sub symbols + easyeda_sub_symbols: EeSymbol = [] + for cad_data_subpart in cad_data.get("subparts", []): + importer = EasyedaSymbolImporter(easyeda_cp_cad_data=cad_data_subpart) + easyeda_sub_symbols.append(importer.get_symbol()) + #END is_id_already_in_symbol_lib = id_already_in_symbol_lib( lib_path=f"{arguments['output']}.{sym_lib_ext}", @@ -278,6 +286,13 @@ def main(argv: List[str] = sys.argv[1:]) -> int: footprint_lib_name=arguments["output"].split("/")[-1].split(".")[0], ) + #adding support for subsymbol kicad export + kicad_sub_symbols_lib = [] + for symbol in easyeda_sub_symbols: + exporter = ExporterSymbolKicad(symbol=symbol, kicad_version=kicad_version) + kicad_sub_symbols_lib.append(exporter.export(footprint_lib_name=arguments["output"].split("/")[-1].split(".")[0],)) + #END + if is_id_already_in_symbol_lib: update_component_in_symbol_lib_file( lib_path=f"{arguments['output']}.{sym_lib_ext}", @@ -291,6 +306,17 @@ def main(argv: List[str] = sys.argv[1:]) -> int: component_content=kicad_symbol_lib, kicad_version=kicad_version, ) + if kicad_sub_symbols_lib: + if (kicad_version == KicadVersion.v6): + add_sub_components_in_symbol_lib_file( + lib_path=f"{arguments['output']}.{sym_lib_ext}", + component_name=easyeda_symbol.info.name, + sub_components_content=kicad_sub_symbols_lib, + kicad_version=kicad_version, + ) + else: + logging.error("The sub-symbols were not added. Only kicad version 6 is currently supported for adding multi unit symbols.") + logging.info( f"Created Kicad symbol for ID : {component_id}\n" diff --git a/easyeda2kicad/easyeda/easyeda_importer.py b/easyeda2kicad/easyeda/easyeda_importer.py index 1ca58ed..94912fc 100644 --- a/easyeda2kicad/easyeda/easyeda_importer.py +++ b/easyeda2kicad/easyeda/easyeda_importer.py @@ -123,8 +123,8 @@ def extract_easyeda_data(self, ee_data: dict, ee_data_info: dict) -> EeSymbol: prefix=ee_data_info["pre"], package=ee_data_info.get("package", None), manufacturer=ee_data_info.get("BOM_Manufacturer", None), - datasheet=ee_data["lcsc"].get("url", None), - lcsc_id=ee_data["lcsc"].get("number", None), + datasheet=ee_data.get("lcsc", {}).get("url", None), #datasheet=ee_data["lcsc"].get("url", None), #edited to protect + lcsc_id=ee_data.get("lcsc", {}).get("number", None), #lcsc_id=ee_data["lcsc"].get("number", None), #edited to protect jlc_id=ee_data_info.get("BOM_JLCPCB Part Class", None), ), bbox=EeSymbolBbox( diff --git a/easyeda2kicad/helpers.py b/easyeda2kicad/helpers.py index 7b06c6b..e7baff3 100644 --- a/easyeda2kicad/helpers.py +++ b/easyeda2kicad/helpers.py @@ -115,6 +115,53 @@ def add_component_in_symbol_lib_file( ) ) +initial_symbol_regex_pattern = { + # "v5": r"(#\n# {component_name}\n#\n.*?ENDDEF\n)", + "v6": r'\(symbol "{component_name}_0_1"\n.*?\)', + "v6_99": r"", +} + +sub_symbol_regex_pattern = { + # "v5": r"(#\n# {component_name}\n#\n.*?ENDDEF\n)", + "v6": r'\(symbol "{component_name}_0_1".*?\n \)', + "v6_99": r"", +} + +# replace the empty symbol, generated from the first iteration, with our sub symbols and discard all their header information. +def add_sub_components_in_symbol_lib_file( + lib_path: str, + component_name: str, + sub_components_content: list[str], + kicad_version: KicadVersion, +) -> None: + with open(file=lib_path, encoding="utf-8") as lib_file: + current_lib = lib_file.read() + components_content = "" + for i, component in enumerate(sub_components_content): + match = re.search( + sub_symbol_regex_pattern[kicad_version.name].format( + component_name=sanitize_for_regex(component_name) + ), + component, + flags=re.DOTALL, + ) + if match: + components_content += "\n " + match.group(0).replace(f"{component_name}_0_1", f"{component_name}_{i+1}_1") #iterate symbol names + new_lib = re.sub( + initial_symbol_regex_pattern[kicad_version.name].format( + component_name=sanitize_for_regex(component_name) + ), + components_content, + current_lib, + flags=re.DOTALL, + ) + new_lib = new_lib.replace( + "(generator kicad_symbol_editor)", + "(generator https://github.com/uPesy/easyeda2kicad.py)", + ) + with open(file=lib_path, mode="w", encoding="utf-8") as lib_file: + lib_file.write(new_lib) + def get_local_config() -> dict: if not os.path.isfile("easyeda2kicad_config.json"):