第17章-核心模块源码分析
第十七章:核心模块源码分析
17.1 公共基础类
17.1.1 EDA_ITEM基类
EDA_ITEM是所有设计项目的基类:
// include/eda_item.h
class EDA_ITEM : public KIGFX::VIEW_ITEM
{
public:
virtual KICAD_T Type() const = 0;
// 状态标志
bool IsSelected() const;
void SetSelected();
void ClearSelected();
// 边界框
virtual const EDA_RECT GetBoundingBox() const;
// 命中测试
virtual bool HitTest(const VECTOR2I& aPosition,
int aAccuracy = 0) const;
// 克隆
virtual EDA_ITEM* Clone() const = 0;
protected:
EDA_ITEM* m_parent;
KICAD_T m_structType;
EDA_ITEM_FLAGS m_flags;
};
17.1.2 EDA_BASE_FRAME窗口基类
// include/eda_base_frame.h
class EDA_BASE_FRAME : public wxFrame
{
public:
// 项目管理
PROJECT& Prj() const;
void SetProject(PROJECT* aProject);
// 工具管理
TOOL_MANAGER* GetToolManager() const;
// 菜单和工具栏
void ReCreateMenuBar();
void ReCreateHToolbar();
// 配置
virtual void LoadSettings(APP_SETTINGS_BASE* aCfg);
virtual void SaveSettings(APP_SETTINGS_BASE* aCfg);
protected:
TOOL_MANAGER* m_toolManager;
ACTIONS* m_actions;
wxAuiManager m_auimgr;
};
17.2 原理图模块(Eeschema)
17.2.1 原理图数据模型
// eeschema/sch_item.h
class SCH_ITEM : public EDA_ITEM
{
public:
// 图层和可见性
SCH_LAYER_ID GetLayer() const;
void SetLayer(SCH_LAYER_ID aLayer);
// 绘制
virtual void Print(const RENDER_SETTINGS* aSettings,
const VECTOR2I& aOffset) = 0;
// 连接
virtual std::vector<VECTOR2I> GetConnectionPoints() const;
// 网络
virtual wxString GetNetName() const;
};
// 原理图符号
class SCH_SYMBOL : public SCH_ITEM
{
private:
LIB_ID m_lib_id; // 库标识
wxString m_prefix; // 参考前缀
TRANSFORM m_transform; // 变换矩阵
std::vector<SCH_PIN*> m_pins; // 引脚
std::vector<SCH_FIELD> m_fields; // 字段
int m_unit; // 单元号
};
// 原理图导线
class SCH_LINE : public SCH_ITEM
{
private:
VECTOR2I m_start;
VECTOR2I m_end;
STROKE_PARAMS m_stroke;
};
17.2.2 原理图编辑器框架
// eeschema/sch_edit_frame.h
class SCH_EDIT_FRAME : public SCH_BASE_FRAME
{
public:
// 原理图访问
SCHEMATIC& Schematic() const;
SCH_SCREEN* GetScreen() const;
// 编辑操作
void SaveProject();
void OpenProjectFiles(const std::vector<wxString>& aFileSet);
// 工具
void RecalculateConnections(SCH_COMMIT* aCommit);
void UpdateNetHighlightStatus();
// ERC
void RunERC();
// 导出
bool ExportNetlist(const wxString& aFileName);
private:
SCHEMATIC* m_schematic;
SCH_DRAW_PANEL* m_canvas;
};
17.2.3 ERC检查引擎
// eeschema/erc.h
class ERC_TESTER
{
public:
ERC_TESTER(SCHEMATIC* aSchematic);
// 运行检查
int RunTests(DS_PROXY_VIEW_ITEM* aDrawingSheet);
// 检查类型
int TestDuplicateSymbols();
int TestMultiUnitPinConflicts();
int TestPinToPin();
int TestNoConnectPins();
int TestSimilarLabels();
private:
SCHEMATIC* m_schematic;
ERC_SETTINGS* m_settings;
std::vector<std::shared_ptr<ERC_ITEM>> m_items;
};
17.3 PCB模块(Pcbnew)
17.3.1 PCB数据模型
// pcbnew/board.h
class BOARD : public BOARD_ITEM_CONTAINER
{
public:
// 设计设置
BOARD_DESIGN_SETTINGS& GetDesignSettings();
// 层管理
LSET GetEnabledLayers() const;
int GetCopperLayerCount() const;
// 元素访问
FOOTPRINTS& Footprints();
TRACKS& Tracks();
ZONES& Zones();
DRAWINGS& Drawings();
// 网络
NETINFO_LIST& GetNetInfo();
NETINFO_ITEM* FindNet(const wxString& aNetname);
// 连接性
std::shared_ptr<CONNECTIVITY_DATA> GetConnectivity() const;
// DRC
DRC_ENGINE* GetDRCEngine();
private:
wxString m_fileName;
BOARD_DESIGN_SETTINGS m_designSettings;
std::vector<FOOTPRINT*> m_footprints;
std::vector<TRACK*> m_tracks;
std::vector<ZONE*> m_zones;
NETINFO_LIST m_netInfo;
};
// 封装类
class FOOTPRINT : public BOARD_ITEM_CONTAINER
{
private:
LIB_ID m_fpid;
VECTOR2I m_pos;
EDA_ANGLE m_orient;
int m_attributes;
std::vector<PAD*> m_pads;
std::vector<BOARD_ITEM*> m_drawings;
};
// 走线类
class PCB_TRACK : public BOARD_CONNECTED_ITEM
{
private:
VECTOR2I m_Start;
VECTOR2I m_End;
int m_Width;
};
// 过孔类
class PCB_VIA : public PCB_TRACK
{
private:
int m_drill;
VIATYPE m_viaType;
PCB_LAYER_ID m_topLayer;
PCB_LAYER_ID m_bottomLayer;
};
17.3.2 PCB编辑器框架
// pcbnew/pcb_edit_frame.h
class PCB_EDIT_FRAME : public PCB_BASE_EDIT_FRAME
{
public:
// 板访问
BOARD* GetBoard() const;
// 文件操作
bool SavePcbFile(const wxString& aFileName);
bool OpenProjectFiles(const std::vector<wxString>& aFileSet);
// 更新
void UpdatePCBFromSchematic(const wxString& aNetlistFile);
// DRC
void RunDRC();
// 导出
void ExportGerbers(const wxString& aDirectory);
void ExportDrillFiles(const wxString& aDirectory);
private:
BOARD* m_pcb;
PCB_DRAW_PANEL_GAL* m_canvas;
};
17.3.3 交互式布线器
// pcbnew/router/pns_router.h
namespace PNS
{
class ROUTER
{
public:
ROUTER();
// 布线控制
bool StartRouting(const VECTOR2I& aP, ITEM* aItem, int aLayer);
bool Move(const VECTOR2I& aP, ITEM* aEndItem);
bool FixRoute(const VECTOR2I& aP, ITEM* aEndItem);
void StopRouting();
// 模式设置
void SetMode(ROUTER_MODE aMode);
void SetInterface(ROUTER_IFACE* aIface);
// 设置
ROUTING_SETTINGS& Settings();
private:
ROUTER_MODE m_mode;
ROUTING_SETTINGS m_settings;
NODE* m_world;
PLACER_BASE* m_placer;
};
// 布线模式
enum ROUTER_MODE
{
PNS_MODE_ROUTE_SINGLE, // 单线布线
PNS_MODE_ROUTE_DIFF_PAIR, // 差分对布线
PNS_MODE_TUNE_SINGLE, // 单线等长
PNS_MODE_TUNE_DIFF_PAIR, // 差分对等长
PNS_MODE_TUNE_DIFF_PAIR_SKEW // 差分对偏斜
};
} // namespace PNS
17.3.4 DRC引擎
// pcbnew/drc/drc_engine.h
class DRC_ENGINE
{
public:
DRC_ENGINE(BOARD* aBoard, BOARD_DESIGN_SETTINGS* aSettings);
// 加载规则
void InitEngine(const wxFileName& aRulesFile);
// 运行检查
bool RunTests(EDA_UNITS aUnits, bool aReportAllTrackErrors);
// 规则查询
DRC_CONSTRAINT EvalRules(DRC_CONSTRAINT_T aConstraint,
const BOARD_ITEM* aA,
const BOARD_ITEM* aB,
PCB_LAYER_ID aLayer);
// 结果访问
const std::vector<std::shared_ptr<DRC_ITEM>>& GetViolations();
private:
BOARD* m_board;
BOARD_DESIGN_SETTINGS* m_designSettings;
std::vector<DRC_RULE*> m_rules;
std::vector<DRC_TEST_PROVIDER*> m_testProviders;
};
17.4 图形渲染系统
17.4.1 GAL接口
// include/gal/graphics_abstraction_layer.h
namespace KIGFX
{
class GAL
{
public:
// 基本绘图
virtual void DrawLine(const VECTOR2D& aStartPoint,
const VECTOR2D& aEndPoint) = 0;
virtual void DrawSegment(const VECTOR2D& aStartPoint,
const VECTOR2D& aEndPoint,
double aWidth) = 0;
virtual void DrawCircle(const VECTOR2D& aCenterPoint,
double aRadius) = 0;
virtual void DrawArc(const VECTOR2D& aCenterPoint,
double aRadius,
const EDA_ANGLE& aStartAngle,
const EDA_ANGLE& aAngle) = 0;
virtual void DrawRectangle(const VECTOR2D& aStartPoint,
const VECTOR2D& aEndPoint) = 0;
virtual void DrawPolygon(const SHAPE_LINE_CHAIN& aPolySet) = 0;
// 属性设置
virtual void SetStrokeColor(const COLOR4D& aColor) = 0;
virtual void SetFillColor(const COLOR4D& aColor) = 0;
virtual void SetLineWidth(float aLineWidth) = 0;
// 变换
virtual void Translate(const VECTOR2D& aTranslation) = 0;
virtual void Rotate(double aAngle) = 0;
virtual void Scale(const VECTOR2D& aScale) = 0;
protected:
VECTOR2D m_screenDPI;
float m_lineWidth;
COLOR4D m_strokeColor;
COLOR4D m_fillColor;
};
} // namespace KIGFX
17.4.2 VIEW系统
// include/view/view.h
namespace KIGFX
{
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 SetMirror(bool aMirrorX, bool aMirrorY);
// 渲染
void Redraw();
void Update(const VIEW_ITEM* aItem);
void UpdateAllItems(int aUpdateFlags);
// 选择
void SetSelectionArea(const BOX2I& aSelectionArea);
private:
std::vector<VIEW_LAYER> m_layers;
VECTOR2D m_center;
double m_scale;
PAINTER* m_painter;
GAL* m_gal;
};
} // namespace KIGFX
17.5 工具框架
17.5.1 工具管理器
// include/tool/tool_manager.h
class TOOL_MANAGER
{
public:
// 工具注册
void RegisterTool(TOOL_BASE* aTool);
// 工具查找
TOOL_BASE* FindTool(const std::string& aName);
template<typename T> T* GetTool();
// 动作执行
bool RunAction(const TOOL_ACTION& aAction, T aParam = {});
// 事件处理
void ProcessEvent(const TOOL_EVENT& aEvent);
void ScheduleNextState(TOOL_BASE* aTool,
TOOL_STATE_FUNC& aHandler,
const TOOL_EVENT_LIST& aConditions);
private:
std::vector<TOOL_BASE*> m_tools;
std::map<std::string, TOOL_BASE*> m_toolNameIndex;
TOOL_DISPATCHER* m_dispatcher;
};
17.5.2 工具定义
// include/tool/tool_interactive.h
class TOOL_INTERACTIVE : public TOOL_BASE
{
public:
// 工具入口
virtual int Main(const TOOL_EVENT& aEvent);
// 等待事件
TOOL_EVENT* Wait(const TOOL_EVENT_LIST& aEventList);
// 设置菜单
void SetContextMenu(ACTION_MENU* aMenu, CONTEXT_MENU_TRIGGER aMode);
// 状态跳转
void Go(int (TOOL_INTERACTIVE::*aStateFunc)(const TOOL_EVENT&),
const TOOL_EVENT_LIST& aConditions);
protected:
TOOL_MENU m_menu;
};
17.6 文件I/O系统
17.6.1 S-Expression解析
// libs/sexpr/sexpr.h
namespace SEXPR
{
class SEXPR
{
public:
enum SEXPR_TYPE
{
SEXPR_TYPE_LIST,
SEXPR_TYPE_ATOM,
SEXPR_TYPE_STRING
};
SEXPR_TYPE GetType() const;
bool IsList() const;
bool IsAtom() const;
bool IsString() const;
// 列表操作
SEXPR& GetChild(size_t aIndex);
size_t GetNumberOfChildren() const;
// 值获取
int GetInteger() const;
double GetDouble() const;
wxString GetString() const;
};
class PARSER
{
public:
SEXPR* Parse(const std::string& aInput);
SEXPR* ParseFromFile(const wxString& aFileName);
};
} // namespace SEXPR
17.6.2 PCB文件解析
// pcbnew/plugins/kicad/pcb_parser.h
class PCB_PARSER
{
public:
PCB_PARSER(LINE_READER* aReader);
BOARD* Parse();
private:
// 解析各种元素
FOOTPRINT* parseFOOTPRINT();
PCB_TRACK* parsePCB_TRACK();
PCB_VIA* parsePCB_VIA();
ZONE* parseZONE();
PAD* parsePAD();
// 辅助函数
VECTOR2I parseXY();
double parseDouble();
int parseInt();
wxString parseString();
LINE_READER* m_reader;
BOARD* m_board;
};
17.7 本章小结
本章深入分析了KiCad的核心模块源码:
- 公共基础类:了解了EDA_ITEM和窗口框架的设计。
- 原理图模块:分析了SCH_ITEM和编辑器的实现。
- PCB模块:深入了解了BOARD类和布线器。
- 图形系统:掌握了GAL和VIEW的架构。
- 工具框架:了解了工具管理和事件处理机制。
- 文件I/O:分析了S-Expression解析系统。
通过本章学习,读者可以理解KiCad的内部实现,为二次开发打下基础。

浙公网安备 33010602011771号