在 Python 中读写 KiCAD 库

kicad_lib_parser.py
__author__ = "Uli Köhler"
__license__ = "CC0 1.0 Universal"

class KiCADDocLibrary(object):
    def __init__(self, records=[]):
        self.records = records

    @staticmethod
    def read(file):
        # 记录是 '$CMP ...' 行和 '$ENDCMP' 行之间的所有内容
        records = []
        current_record = None
        for line in file:
            line = line.strip()
            if line.startswith('$CMP '):
                current_record = []
            # 如果我们有任何当前记录则将行添加到记录
            if current_record is not None:
                current_record.append(line)
            if line.startswith("$ENDCMP"):
                if current_record is not None:
                    records.append(current_record)
                    current_record = None
        return KiCADDocLibrary(records)

    def write(self, out):
        # 写入头
        out.write("EESchema-DOCLIB  Version 2.0\n")
        # 写入记录
        for rec in self.records:
            out.write("#\n")
            for line in rec:
                out.write(line)
                out.write("\n")
        # 写入页脚
        out.write("#\n#End Doc Library\n")


class KiCADSchematicSymbolLibrary(object):
    def __init__(self, records=[]):
        self.records = records

    @staticmethod
    def read(file):
        # 记录是 'DEF ...' 行和 'ENDDEF' 行之间的所有内容
        records = []
        current_record = None
        current_comment_lines = [] #
        for line in file:
            line = line.strip()
            if line.startswith("#encoding"):
                continue # 忽略 - 我们始终使用 #encoding utf-8
            # 注释行处理
            if line.startswith("#"):
                current_comment_lines.append(line)
            # 记录开始
            if line.startswith('DEF '):
                current_record = current_comment_lines
                current_comment_lines = []
            # 如果我们有任何当前记录则将行添加到记录
            if current_record is not None:
                current_record.append(line)
            if line.startswith("ENDDEF"):
                if current_record is not None:
                    records.append(current_record)
                    current_record = None
            # 清除注释行
            # 我们只能现在这样做以避免在之前清除它们
            #  它们在 DEF 子句中使用
            if not line.startswith("#"):
                current_comment_lines = []
        return KiCADSchematicSymbolLibrary(records)

    def write(self, out):
        # 写入头
        out.write("EESchema-LIBRARY Version 2.4\n#encoding utf-8\n")
        # 写入记录
        for rec in self.records:
            for line in rec:
                out.write(line)
                out.write("\n")
        # 写入页脚
        out.write("#\n#End Library\n")

Check out similar posts by category: Electronics, KiCad