第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的核心模块源码:

  1. 公共基础类:了解了EDA_ITEM和窗口框架的设计。
  2. 原理图模块:分析了SCH_ITEM和编辑器的实现。
  3. PCB模块:深入了解了BOARD类和布线器。
  4. 图形系统:掌握了GAL和VIEW的架构。
  5. 工具框架:了解了工具管理和事件处理机制。
  6. 文件I/O:分析了S-Expression解析系统。

通过本章学习,读者可以理解KiCad的内部实现,为二次开发打下基础。


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