第03章-核心架构与模块设计

第三章:核心架构与模块设计

3.1 KiCad整体架构概述

3.1.1 软件架构层次

KiCad采用模块化的软件架构设计,整个系统可以分为以下几个层次:

┌─────────────────────────────────────────────────────────────┐
│                    用户界面层 (User Interface)               │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐       │
│  │项目管理器│原理图编辑│PCB编辑器│3D查看器 │其他工具  │       │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘       │
├─────────────────────────────────────────────────────────────┤
│                    应用逻辑层 (Application Logic)            │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐       │
│  │设计规则  │布线算法  │覆铜算法  │仿真引擎  │文件解析  │       │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘       │
├─────────────────────────────────────────────────────────────┤
│                    核心库层 (Core Libraries)                 │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐       │
│  │几何计算  │数据模型  │图形渲染  │脚本引擎  │I/O处理  │       │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘       │
├─────────────────────────────────────────────────────────────┤
│                    基础设施层 (Infrastructure)               │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐       │
│  │wxWidgets│OpenGL   │Boost    │Python   │ngspice  │       │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘       │
├─────────────────────────────────────────────────────────────┤
│                    操作系统层 (Operating System)             │
│              Windows / macOS / Linux                         │
└─────────────────────────────────────────────────────────────┘

3.1.2 核心技术栈

主要编程语言:

  • C++:核心功能和性能关键代码
  • Python:脚本接口和插件系统
  • CMake:构建系统
  • SWIG:C++/Python绑定生成

关键依赖库:

wxWidgets (3.2+)
  用途:跨平台GUI框架
  模块:wxCore, wxBase, wxAUI, wxGL

Boost
  用途:C++标准库扩展
  模块:filesystem, locale, interprocess

OpenGL / OpenCASCADE (OCCT)
  用途:3D图形渲染和几何建模
  特性:光线追踪、STEP模型导入

ngspice
  用途:SPICE仿真引擎
  功能:直流分析、瞬态分析、交流分析

Python 3.x
  用途:脚本接口
  绑定:通过SWIG生成的pcbnew模块

3.1.3 项目目录结构

KiCad源代码的主要目录结构如下:

kicad/
├── 3d-viewer/           # 3D查看器模块
├── bitmap2component/    # 位图转元器件工具
├── cmake/               # CMake构建脚本
├── common/              # 共享代码库
├── cvpcb/               # 元器件与封装关联工具
├── eeschema/            # 原理图编辑器
├── gerbview/            # Gerber查看器
├── include/             # 公共头文件
├── kicad/               # 项目管理器
├── libs/                # 第三方库和工具库
│   ├── kimath/          # 数学计算库
│   ├── kiplatform/      # 平台相关代码
│   └── sexpr/           # S-expression解析器
├── pagelayout_editor/   # 页面布局编辑器
├── pcb_calculator/      # PCB计算器
├── pcbnew/              # PCB编辑器
├── plugins/             # 插件框架
├── qa/                  # 质量保证/测试
├── resources/           # 资源文件
├── scripting/           # Python脚本支持
├── thirdparty/          # 第三方代码
└── utils/               # 实用工具

3.2 数据模型与文件格式

3.2.1 S-Expression文件格式

KiCad使用基于S-Expression(S表达式)的文本格式存储设计数据。这种格式具有以下特点:

格式优势:

  • 人类可读且可编辑
  • 版本控制友好(易于diff)
  • 结构化且可扩展
  • 解析效率高

基本语法:

; S-Expression基本结构
(token [属性1] [属性2] ... [子表达式])

; 示例:定义一个电阻符号
(symbol "R"
  (pin_names
    (offset 0)
  )
  (in_bom yes)
  (on_board yes)
  (property "Reference" "R"
    (at 2.54 0 90)
    (effects
      (font
        (size 1.27 1.27)
      )
    )
  )
)

3.2.2 主要文件格式

项目文件(.kicad_pro):

(kicad_pro
  (version 1)
  (generator "kicad")
  (project
    (meta
      (filename "my_project.kicad_pro")
    )
  )
  (schematic
    (legacy_lib_dir "")
    (legacy_lib_list ())
  )
  (board
    (design_settings (...)
    )
    (layer_presets ())
    (viewports ())
  )
  (libraries
    (pinned_symbol_libs ())
    (pinned_footprint_libs ())
  )
)

原理图文件(.kicad_sch):

(kicad_sch
  (version 20231120)
  (generator "eeschema")
  (generator_version "8.0")
  (uuid "abc12345-...")
  
  (paper "A4")
  
  ; 库符号定义
  (lib_symbols
    (symbol "Device:R" ...)
  )
  
  ; 放置的符号实例
  (symbol
    (lib_id "Device:R")
    (at 100.33 50.8 0)
    (unit 1)
    (exclude_from_sim no)
    (in_bom yes)
    (on_board yes)
    (uuid "def67890-...")
    (property "Reference" "R1" ...)
    (property "Value" "10k" ...)
  )
  
  ; 导线连接
  (wire
    (pts
      (xy 100.33 48.26)
      (xy 100.33 45.72)
    )
    (stroke (width 0) (type default))
    (uuid "...")
  )
)

PCB文件(.kicad_pcb):

(kicad_pcb
  (version 20240108)
  (generator "pcbnew")
  (generator_version "8.0")
  
  ; 通用设置
  (general
    (thickness 1.6)
    (legacy_teardrops no)
  )
  
  ; 纸张设置
  (paper "A4")
  
  ; 层定义
  (layers
    (0 "F.Cu" signal)
    (31 "B.Cu" signal)
    (32 "B.Adhes" user "B.Adhesive")
    (33 "F.Adhes" user "F.Adhesive")
    ...
  )
  
  ; 设计规则
  (setup
    (pad_to_mask_clearance 0)
    (allow_soldermask_bridges_in_footprints no)
    (pcbplotparams ...)
  )
  
  ; 网络定义
  (net 0 "")
  (net 1 "GND")
  (net 2 "VCC")
  
  ; 封装定义
  (footprint "Resistor_SMD:R_0603_1608Metric"
    (layer "F.Cu")
    (uuid "...")
    (at 100.33 50.8)
    (property "Reference" "R1" ...)
    (pad "1" smd roundrect ...)
    (pad "2" smd roundrect ...)
  )
  
  ; 走线
  (segment
    (start 100.33 48.26)
    (end 105.41 48.26)
    (width 0.25)
    (layer "F.Cu")
    (net 1)
    (uuid "...")
  )
  
  ; 过孔
  (via
    (at 105.41 48.26)
    (size 0.8)
    (drill 0.4)
    (layers "F.Cu" "B.Cu")
    (net 1)
    (uuid "...")
  )
  
  ; 覆铜区域
  (zone
    (net 1)
    (net_name "GND")
    (layer "F.Cu")
    (polygon
      (pts
        (xy 90 40)
        (xy 120 40)
        (xy 120 60)
        (xy 90 60)
      )
    )
    (fill yes)
  )
)

符号库文件(.kicad_sym):

(kicad_symbol_lib
  (version 20231120)
  (generator "kicad_symbol_editor")
  (generator_version "8.0")
  
  (symbol "MyResistor"
    (pin_numbers hide)
    (pin_names
      (offset 0)
    )
    (exclude_from_sim no)
    (in_bom yes)
    (on_board yes)
    
    (property "Reference" "R"
      (at 2.032 0.762 0)
      (effects (font (size 1.27 1.27)) (justify left))
    )
    (property "Value" "MyResistor"
      (at 2.032 -1.27 0)
      (effects (font (size 1.27 1.27)) (justify left))
    )
    
    ; 图形元素
    (symbol "MyResistor_0_1"
      (rectangle
        (start -1.016 2.54)
        (end 1.016 -2.54)
        (stroke (width 0.254) (type default))
        (fill (type none))
      )
    )
    
    ; 引脚定义
    (symbol "MyResistor_1_1"
      (pin passive line
        (at 0 5.08 270)
        (length 2.54)
        (name "1" (effects (font (size 1.27 1.27))))
        (number "1" (effects (font (size 1.27 1.27))))
      )
      (pin passive line
        (at 0 -5.08 90)
        (length 2.54)
        (name "2" (effects (font (size 1.27 1.27))))
        (number "2" (effects (font (size 1.27 1.27))))
      )
    )
  )
)

封装库文件(.kicad_mod):

(footprint "R_0603_1608Metric"
  (version 20240108)
  (generator "pcbnew")
  (generator_version "8.0")
  (layer "F.Cu")
  (descr "Resistor SMD 0603 (1608 Metric)")
  (tags "resistor")
  (attr smd)
  
  ; 焊盘定义
  (pad "1" smd roundrect
    (at -0.825 0)
    (size 0.8 0.95)
    (layers "F.Cu" "F.Paste" "F.Mask")
    (roundrect_rratio 0.25)
  )
  (pad "2" smd roundrect
    (at 0.825 0)
    (size 0.8 0.95)
    (layers "F.Cu" "F.Paste" "F.Mask")
    (roundrect_rratio 0.25)
  )
  
  ; 丝印层图形
  (fp_line
    (start -0.237 0.58)
    (end 0.237 0.58)
    (stroke (width 0.12) (type solid))
    (layer "F.SilkS")
  )
  
  ; 3D模型引用
  (model "${KICAD8_3DMODEL_DIR}/Resistors_SMD.3dshapes/R_0603_1608Metric.wrl"
    (offset (xyz 0 0 0))
    (scale (xyz 1 1 1))
    (rotate (xyz 0 0 0))
  )
)

3.2.3 数据模型类图

┌─────────────────────────────────────────────────────────────┐
│                        KIWAY                                 │
│    (KiCad应用程序框架和模块管理器)                           │
└───────────────────────┬─────────────────────────────────────┘
                        │
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│   SCHEMATIC   │ │     BOARD     │ │   LIBRARIES   │
│   (原理图)    │ │    (PCB)     │ │    (库)      │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
        │                 │                 │
        ▼                 ▼                 ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│  SCH_SYMBOL   │ │   FOOTPRINT   │ │  LIB_SYMBOL   │
│  SCH_SHEET    │ │    TRACK      │ │  LIB_FP       │
│  SCH_WIRE     │ │     VIA       │ │  LIB_3DMODEL  │
│  SCH_JUNCTION │ │    ZONE       │ │               │
│  SCH_LABEL    │ │     PAD       │ │               │
└───────────────┘ └───────────────┘ └───────────────┘

3.3 应用程序模块

3.3.1 项目管理器(KiCad Manager)

主要功能:

  • 项目创建、打开和管理
  • 启动各子工具
  • 项目设置管理
  • 最近项目列表

核心类:

// 项目管理器主窗口类
class KICAD_MANAGER_FRAME : public EDA_BASE_FRAME
{
public:
    void OnNewProject();         // 创建新项目
    void OnOpenProject();        // 打开项目
    void OnCloseProject();       // 关闭项目
    void OnRunTool();            // 运行子工具
    
private:
    PROJECT m_project;           // 当前项目
    wxTreeCtrl* m_TreeProject;   // 项目树视图
};

// 项目类
class PROJECT
{
public:
    wxString GetProjectName();
    wxString GetProjectPath();
    void SetProjectPath(const wxString& aPath);
    
    // 项目设置
    PROJECT_LOCAL_SETTINGS& GetLocalSettings();
    NETLIST& GetNetlist();
};

3.3.2 原理图编辑器(Eeschema)

架构组成:

EESCHEMA
├── SCH_EDIT_FRAME           # 主编辑窗口
│   ├── SCH_SCREEN           # 原理图页面
│   ├── SCH_CANVAS           # 绘图画布
│   └── TOOL_MANAGER         # 工具管理器
│
├── SCH_DRAW_PANEL_GAL       # GAL绘图面板
│   └── VIEW                 # 视图管理
│
├── Tools                    # 编辑工具
│   ├── SCH_DRAWING_TOOLS    # 绘图工具
│   ├── SCH_EDIT_TOOL        # 编辑工具
│   ├── SCH_LINE_WIRE_BUS    # 线路工具
│   └── SCH_MOVE_TOOL        # 移动工具
│
└── ERC_ENGINE               # 电气规则检查引擎

关键数据结构:

// 原理图项基类
class SCH_ITEM : public EDA_ITEM
{
public:
    virtual void Draw(RENDER_SETTINGS* aSettings) = 0;
    virtual EDA_RECT GetBoundingBox() const = 0;
    virtual bool HitTest(const wxPoint& aPosition) const = 0;
};

// 原理图符号
class SCH_SYMBOL : public SCH_ITEM
{
private:
    LIB_ID m_lib_id;                  // 库标识
    wxString m_reference;             // 参考标号
    wxPoint m_pos;                    // 位置
    int m_unit;                       // 单元号
    std::vector<SCH_PIN*> m_pins;     // 引脚列表
    std::vector<SCH_FIELD*> m_fields; // 字段列表
};

// 原理图导线
class SCH_WIRE : public SCH_LINE
{
    // 继承自SCH_LINE,专门处理导线
};

3.3.3 PCB编辑器(Pcbnew)

架构组成:

PCBNEW
├── PCB_EDIT_FRAME           # 主编辑窗口
│   ├── BOARD                # PCB板数据
│   ├── PCB_DRAW_PANEL_GAL   # GAL绘图面板
│   └── TOOL_MANAGER         # 工具管理器
│
├── Router                   # 布线器
│   ├── PNS_ROUTER           # 推挽布线核心
│   ├── PNS_LINE             # 布线路径
│   └── PNS_VIA              # 过孔处理
│
├── Zone Filler              # 覆铜填充器
│   └── ZONE_FILLER          # 覆铜算法实现
│
├── DRC Engine               # 设计规则检查
│   ├── DRC_ENGINE           # DRC引擎
│   └── DRC_RULE             # DRC规则
│
└── 3D Viewer                # 3D查看器接口

关键数据结构:

// PCB板类
class BOARD : public BOARD_ITEM_CONTAINER
{
public:
    // 板子属性
    BOARD_DESIGN_SETTINGS& GetDesignSettings();
    LSET GetEnabledLayers() const;
    int GetLayerCount() const;
    
    // 元素访问
    FOOTPRINTS& Footprints();
    TRACKS& Tracks();
    ZONES& Zones();
    DRAWINGS& Drawings();
    
    // 网络管理
    NETINFO_LIST& GetNetInfo();
    
private:
    std::vector<FOOTPRINT*> m_footprints;
    std::vector<TRACK*> m_tracks;
    std::vector<ZONE*> m_zones;
    BOARD_DESIGN_SETTINGS m_designSettings;
    NETINFO_LIST m_netInfo;
};

// 封装类
class FOOTPRINT : public BOARD_ITEM_CONTAINER
{
private:
    LIB_ID m_fpid;                    // 封装库ID
    wxString m_reference;             // 参考标号
    wxPoint m_pos;                    // 位置
    double m_orient;                  // 方向角度
    std::vector<PAD*> m_pads;         // 焊盘列表
    std::vector<BOARD_ITEM*> m_drawings; // 图形元素
};

// 走线类
class TRACK : public BOARD_CONNECTED_ITEM
{
private:
    wxPoint m_Start;                  // 起点
    wxPoint m_End;                    // 终点
    int m_Width;                      // 线宽
    PCB_LAYER_ID m_Layer;             // 所在层
};

// 过孔类
class VIA : public TRACK
{
private:
    int m_Drill;                      // 钻孔直径
    VIATYPE m_ViaType;                // 过孔类型
    LSET m_LayerPair;                 // 连接的层对
};

3.3.4 3D查看器

架构组成:

3D_VIEWER
├── EDA_3D_VIEWER_FRAME      # 3D查看器窗口
│   └── EDA_3D_CANVAS        # 3D画布
│
├── RENDER_3D_BASE           # 渲染器基类
│   ├── RENDER_3D_OPENGL     # OpenGL渲染器
│   └── RENDER_3D_RAYTRACE   # 光线追踪渲染器
│
├── BOARD_ADAPTER            # 板卡数据适配器
│   └── Converts BOARD to 3D geometry
│
└── Model Loader             # 3D模型加载器
    ├── STEP Importer        # STEP格式
    ├── VRML Importer        # VRML格式
    └── IDF Importer         # IDF格式

3.4 图形渲染系统

3.4.1 GAL (Graphics Abstraction Layer)

KiCad使用GAL作为图形抽象层,支持多种渲染后端:

// GAL抽象接口
class GAL
{
public:
    // 基本绘图操作
    virtual void DrawLine(const VECTOR2D& aStartPoint, 
                          const VECTOR2D& aEndPoint) = 0;
    virtual void DrawCircle(const VECTOR2D& aCenterPoint, 
                            double aRadius) = 0;
    virtual void DrawArc(const VECTOR2D& aCenterPoint, 
                         double aRadius, 
                         double aStartAngle, 
                         double aEndAngle) = 0;
    virtual void DrawRectangle(const VECTOR2D& aStartPoint, 
                               const VECTOR2D& aEndPoint) = 0;
    virtual void DrawPolygon(const SHAPE_POLY_SET& aPolySet) = 0;
    
    // 变换操作
    virtual void Translate(const VECTOR2D& aTranslation) = 0;
    virtual void Rotate(double aAngle) = 0;
    virtual void Scale(const VECTOR2D& aScale) = 0;
    
    // 属性设置
    virtual void SetStrokeColor(const COLOR4D& aColor) = 0;
    virtual void SetFillColor(const COLOR4D& aColor) = 0;
    virtual void SetLineWidth(float aLineWidth) = 0;
};

// OpenGL实现
class OPENGL_GAL : public GAL
{
    // 使用OpenGL实现所有绘图操作
};

// Cairo实现(软件渲染)
class CAIRO_GAL : public GAL
{
    // 使用Cairo实现所有绘图操作
};

3.4.2 视图系统(VIEW)

// 视图类 - 管理所有可见元素
class VIEW
{
public:
    // 图层管理
    void Add(VIEW_ITEM* aItem, int aDrawPriority = 0);
    void Remove(VIEW_ITEM* aItem);
    void SetLayerVisible(int aLayer, bool aVisible);
    
    // 视图变换
    void SetCenter(const VECTOR2D& aCenter);
    void SetScale(double aScale);
    void SetRotation(double aRotation);
    
    // 渲染
    void Redraw();
    void Update(const VIEW_ITEM* aItem);
    
private:
    std::vector<VIEW_LAYER> m_layers;
    VECTOR2D m_center;
    double m_scale;
    GAL* m_gal;
};

// 视图项目基类
class VIEW_ITEM
{
public:
    virtual const BOX2I ViewBBox() const = 0;
    virtual void ViewDraw(int aLayer, VIEW* aView) const = 0;
    virtual std::vector<int> ViewGetLayers() const = 0;
};

3.4.3 渲染管线

┌─────────────────────────────────────────────────────────────┐
│                    数据模型 (Data Model)                     │
│           BOARD / SCHEMATIC / SYMBOL 等数据结构              │
└─────────────────────────────┬───────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    视图适配 (View Adapter)                   │
│              将数据模型转换为VIEW_ITEM对象                    │
└─────────────────────────────┬───────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      VIEW系统                                │
│              管理图层、可见性、选择状态                        │
└─────────────────────────────┬───────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    GAL抽象层                                 │
│              提供统一的图形绘制接口                           │
└─────────────────────────────┬───────────────────────────────┘
                              │
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
       ┌───────────┐   ┌───────────┐   ┌───────────┐
       │ OpenGL    │   │   Cairo   │   │  Software │
       │ Backend   │   │  Backend  │   │  Backend  │
       └───────────┘   └───────────┘   └───────────┘

3.5 工具系统(Tool Framework)

3.5.1 工具管理器

KiCad使用统一的工具框架来管理所有编辑操作:

// 工具管理器
class TOOL_MANAGER
{
public:
    // 工具注册和管理
    void RegisterTool(TOOL_BASE* aTool);
    TOOL_BASE* FindTool(const std::string& aToolName);
    
    // 工具调用
    bool InvokeTool(const std::string& aToolName);
    bool RunAction(const TOOL_ACTION& aAction);
    
    // 事件处理
    void ProcessEvent(const TOOL_EVENT& aEvent);
    
private:
    std::vector<TOOL_BASE*> m_tools;
    TOOL_EVENT_DISPATCHER m_dispatcher;
};

// 工具基类
class TOOL_BASE
{
public:
    virtual void Reset() = 0;
    virtual bool Init() = 0;
    virtual const std::string& GetName() const = 0;
    
protected:
    TOOL_MANAGER* m_toolMgr;
};

// 交互式工具
class TOOL_INTERACTIVE : public TOOL_BASE
{
public:
    // 工具入口点
    int Main(const TOOL_EVENT& aEvent);
    
    // 等待下一个事件
    TOOL_EVENT* Wait();
    
    // 设置过渡状态
    void SetContextMenu(ACTION_MENU* aMenu);
};

3.5.2 工具动作(Tool Actions)

// 工具动作定义
class TOOL_ACTION
{
public:
    // 动作属性
    wxString GetName() const;
    wxString GetLabel() const;
    wxString GetDescription() const;
    
    // 快捷键
    int GetHotKey() const;
    
    // 图标
    BITMAPS GetIcon() const;
    
private:
    wxString m_name;            // 唯一名称
    wxString m_label;           // 菜单标签
    wxString m_description;     // 描述
    int m_hotKey;               // 热键
    BITMAPS m_icon;             // 图标
};

// 动作示例
namespace ACTIONS
{
    extern TOOL_ACTION cut;          // 剪切
    extern TOOL_ACTION copy;         // 复制
    extern TOOL_ACTION paste;        // 粘贴
    extern TOOL_ACTION undo;         // 撤销
    extern TOOL_ACTION redo;         // 重做
    extern TOOL_ACTION zoomIn;       // 放大
    extern TOOL_ACTION zoomOut;      // 缩小
}

3.5.3 事件系统

// 工具事件类型
enum TOOL_EVENT_TYPE
{
    TC_NONE         = 0,
    TC_MOUSE        = 1,     // 鼠标事件
    TC_KEYBOARD     = 2,     // 键盘事件
    TC_COMMAND      = 4,     // 命令事件
    TC_MESSAGE      = 8,     // 消息事件
    TC_VIEW         = 16,    // 视图事件
};

// 工具事件
class TOOL_EVENT
{
public:
    // 获取事件类型
    TOOL_EVENT_TYPE Category() const;
    
    // 鼠标位置
    VECTOR2D Position() const;
    
    // 按键状态
    int Modifier() const;
    int KeyCode() const;
    
    // 命令参数
    std::any Parameter() const;
    
private:
    TOOL_EVENT_TYPE m_category;
    VECTOR2D m_position;
    int m_modifiers;
    int m_keyCode;
    std::any m_param;
};

3.6 设计规则系统

3.6.1 DRC引擎架构

// DRC引擎
class DRC_ENGINE
{
public:
    // 加载规则
    void InitEngine(const wxFileName& aRulesFile);
    
    // 运行检查
    bool RunTests(BOARD_COMMIT& aCommit);
    
    // 获取结果
    const std::vector<std::shared_ptr<DRC_ITEM>>& GetViolations() const;
    
    // 规则查询
    DRC_RULE* EvalRules(DRC_CONSTRAINT_TYPE aConstraint,
                        const BOARD_ITEM* aA,
                        const BOARD_ITEM* aB,
                        PCB_LAYER_ID aLayer);

private:
    std::vector<DRC_RULE*> m_rules;
    std::vector<std::shared_ptr<DRC_ITEM>> m_violations;
};

// DRC规则
class DRC_RULE
{
public:
    wxString m_name;           // 规则名称
    wxString m_condition;      // 条件表达式
    std::vector<DRC_CONSTRAINT> m_constraints; // 约束列表
};

// DRC约束
class DRC_CONSTRAINT
{
public:
    DRC_CONSTRAINT_TYPE m_type;  // 约束类型
    int m_value;                  // 约束值
    int m_min;                    // 最小值
    int m_max;                    // 最大值
};

3.6.2 DRC规则文件格式

# KiCad DRC规则文件示例

# 版本声明
(version 1)

# 全局规则
(rule "default"
    (constraint clearance (min 0.2mm))
    (constraint track_width (min 0.2mm) (max 10mm))
    (constraint via_diameter (min 0.8mm))
    (constraint hole_diameter (min 0.4mm))
)

# 电源网络规则
(rule "power_nets"
    (condition "A.NetClass == 'Power'")
    (constraint track_width (min 0.5mm))
    (constraint clearance (min 0.3mm))
)

# 高速信号规则
(rule "high_speed"
    (condition "A.NetClass == 'HighSpeed'")
    (constraint length_difference (max 1mm))
    (constraint skew (max 0.1mm))
)

# 差分对规则
(rule "differential_pairs"
    (condition "A.inDiffPair('*')")
    (constraint diff_pair_gap (min 0.15mm) (opt 0.18mm) (max 0.25mm))
    (constraint diff_pair_uncoupled (max 5mm))
)

3.7 脚本系统

3.7.1 Python接口架构

Python脚本系统架构
├── SWIG绑定层
│   ├── pcbnew.py          # PCB编辑器绑定
│   ├── eeschema.py        # 原理图编辑器绑定(部分)
│   └── _pcbnew.so/.pyd    # 编译的绑定模块
│
├── Python API
│   ├── 板级访问
│   │   ├── GetBoard()
│   │   ├── Footprints()
│   │   ├── Tracks()
│   │   └── Zones()
│   │
│   ├── 几何操作
│   │   ├── wxPoint / VECTOR2I
│   │   ├── EDA_RECT / BOX2I
│   │   └── SHAPE_POLY_SET
│   │
│   └── 插件框架
│       ├── ActionPlugin
│       ├── FootprintWizard
│       └── FilePlugin
│
└── IPC API(KiCad 9+)
    ├── kicad-python包
    ├── 实时通信
    └── 完整API访问

3.7.2 Python API示例

# 获取当前板子
import pcbnew

board = pcbnew.GetBoard()

# 遍历所有封装
for footprint in board.GetFootprints():
    ref = footprint.GetReference()
    value = footprint.GetValue()
    pos = footprint.GetPosition()
    print(f"{ref}: {value} at ({pcbnew.ToMM(pos.x)}, {pcbnew.ToMM(pos.y)})")

# 遍历所有走线
for track in board.GetTracks():
    if track.GetClass() == "PCB_TRACK":
        start = track.GetStart()
        end = track.GetEnd()
        width = pcbnew.ToMM(track.GetWidth())
        layer = track.GetLayerName()
        print(f"Track: {layer} Width={width}mm")

# 遍历所有网络
for netinfo in board.GetNetInfo().NetsByNetcode().values():
    print(f"Net: {netinfo.GetNetname()}")

# 创建新走线
track = pcbnew.PCB_TRACK(board)
track.SetStart(pcbnew.wxPointMM(10, 10))
track.SetEnd(pcbnew.wxPointMM(50, 10))
track.SetWidth(pcbnew.FromMM(0.25))
track.SetLayer(pcbnew.F_Cu)
track.SetNet(board.FindNet("GND"))
board.Add(track)

# 刷新显示
pcbnew.Refresh()

3.7.3 动作插件示例

import pcbnew

class MyPlugin(pcbnew.ActionPlugin):
    def defaults(self):
        self.name = "我的插件"
        self.category = "自动化"
        self.description = "这是一个示例插件"
        self.show_toolbar_button = True
        self.icon_file_name = "my_icon.png"
    
    def Run(self):
        board = pcbnew.GetBoard()
        
        # 获取所有封装
        footprints = board.GetFootprints()
        
        # 统计信息
        smd_count = 0
        tht_count = 0
        
        for fp in footprints:
            if fp.GetAttributes() & pcbnew.FP_SMD:
                smd_count += 1
            else:
                tht_count += 1
        
        # 显示消息
        import wx
        wx.MessageBox(
            f"SMD元器件: {smd_count}\nTHT元器件: {tht_count}",
            "封装统计",
            wx.OK | wx.ICON_INFORMATION
        )

# 注册插件
MyPlugin().register()

3.8 插件框架

3.8.1 插件类型

KiCad支持多种类型的插件:

// 插件基类
class PLUGIN
{
public:
    virtual const wxString& GetName() const = 0;
    virtual const wxString& GetDescription() const = 0;
};

// 文件I/O插件
class IO_MGR : public PLUGIN
{
public:
    enum PCB_FILE_T
    {
        KICAD_SEXP,      // KiCad原生格式
        LEGACY,          // 旧版格式
        EAGLE,           // Eagle导入
        ALTIUM,          // Altium导入
        // ...
    };
    
    virtual BOARD* Load(const wxString& aFileName) = 0;
    virtual void Save(const wxString& aFileName, BOARD* aBoard) = 0;
};

// 封装向导插件
class FOOTPRINT_WIZARD : public PLUGIN
{
public:
    virtual wxArrayString GetParameterNames() = 0;
    virtual void SetParameter(const wxString& aName, double aValue) = 0;
    virtual FOOTPRINT* BuildFootprint() = 0;
};

// 动作插件
class ACTION_PLUGIN : public PLUGIN
{
public:
    virtual void Run() = 0;
    virtual bool HasButton() const = 0;
    virtual wxString GetIconFileName() const = 0;
};

3.8.2 C++插件开发

// 示例:自定义文件导入插件

#include <plugin.h>
#include <pcb_io.h>

class MY_CUSTOM_PLUGIN : public PCB_IO
{
public:
    const wxString& GetName() const override
    {
        static wxString name = "My Custom Format";
        return name;
    }
    
    const wxString& GetFileExtension() const override
    {
        static wxString ext = ".myf";
        return ext;
    }
    
    BOARD* Load(const wxString& aFileName, 
                BOARD* aAppendToMe = nullptr,
                const STRING_UTF8_MAP* aProperties = nullptr) override
    {
        BOARD* board = aAppendToMe ? aAppendToMe : new BOARD();
        
        // 解析自定义格式文件
        // ...
        
        return board;
    }
    
    void Save(const wxString& aFileName, 
              BOARD* aBoard,
              const STRING_UTF8_MAP* aProperties = nullptr) override
    {
        // 保存为自定义格式
        // ...
    }
};

// 插件注册
extern "C" PLUGIN* Create()
{
    return new MY_CUSTOM_PLUGIN();
}

3.9 本章小结

本章深入介绍了KiCad的核心架构和模块设计:

  1. 整体架构:了解了KiCad的分层架构设计,包括用户界面层、应用逻辑层、核心库层和基础设施层。

  2. 数据模型与文件格式:深入学习了KiCad使用的S-Expression文件格式,以及各种文件类型(项目、原理图、PCB、符号库、封装库)的结构。

  3. 应用程序模块:了解了项目管理器、原理图编辑器、PCB编辑器和3D查看器的架构组成和关键类。

  4. 图形渲染系统:学习了GAL图形抽象层和VIEW视图系统的工作原理。

  5. 工具系统:理解了KiCad的工具框架,包括工具管理器、工具动作和事件系统。

  6. 设计规则系统:了解了DRC引擎的架构和规则文件格式。

  7. 脚本系统:学习了Python接口架构和API使用方法。

  8. 插件框架:了解了KiCad支持的各种插件类型和开发方法。

通过本章的学习,读者应该对KiCad的内部工作原理有了深入的理解,这为后续的高级使用和二次开发打下了坚实的基础。在下一章中,我们将学习原理图设计的基础知识和实际操作技巧。


posted @ 2026-01-10 13:17  我才是银古  阅读(25)  评论(0)    收藏  举报