第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的核心架构和模块设计:
-
整体架构:了解了KiCad的分层架构设计,包括用户界面层、应用逻辑层、核心库层和基础设施层。
-
数据模型与文件格式:深入学习了KiCad使用的S-Expression文件格式,以及各种文件类型(项目、原理图、PCB、符号库、封装库)的结构。
-
应用程序模块:了解了项目管理器、原理图编辑器、PCB编辑器和3D查看器的架构组成和关键类。
-
图形渲染系统:学习了GAL图形抽象层和VIEW视图系统的工作原理。
-
工具系统:理解了KiCad的工具框架,包括工具管理器、工具动作和事件系统。
-
设计规则系统:了解了DRC引擎的架构和规则文件格式。
-
脚本系统:学习了Python接口架构和API使用方法。
-
插件框架:了解了KiCad支持的各种插件类型和开发方法。
通过本章的学习,读者应该对KiCad的内部工作原理有了深入的理解,这为后续的高级使用和二次开发打下了坚实的基础。在下一章中,我们将学习原理图设计的基础知识和实际操作技巧。

浙公网安备 33010602011771号