【agent辅助pcb routing coding学习】实践4 kicad pcb 核心类层次关系

KiCad Pcbnew 核心类图

概述

本文档展示了KiCad Pcbnew中核心类的关系图,包括继承关系、组合关系和关联关系。

核心类继承层次结构

EDA_ITEM
BOARD_ITEM
BOARD_CONNECTED_ITEM
NETINFO_ITEM
PCB_TABLE
PCB_GROUP
PCB_TEXT
PCB_MARKER
PCB_TARGET
PCB_POINT
PCB_REFERENCE_IMAGE
PCB_BARCODE
PCB_BOARD_OUTLINE
BOARD_ITEM_CONTAINER
BOARD
FOOTPRINT
PCB_TRACK
PAD
ZONE
PCB_SHAPE
PCB_ARC
PCB_VIA

主要类详细定义

1. EDA_ITEM (基础类)

c++ 复制代码
class EDA_ITEM {
    +EDA_ITEM(KICAD_T aType)
    +virtual ~EDA_ITEM()
    +KICAD_T Type() const
    +virtual const BOX2I GetBoundingBox() const
    +virtual bool HitTest(const VECTOR2I& aPosition) const
    +EDA_ITEM* GetParent() const
    +void SetParent(EDA_ITEM* aParent)
    #EDA_ITEM* m_parent
    #KICAD_T m_structType
}

2. BOARD_ITEM (PCB项目基类)

c++ 复制代码
class BOARD_ITEM {
    +BOARD_ITEM(BOARD_ITEM* aParent, KICAD_T aType)
    +virtual ~BOARD_ITEM()
    +virtual const BOARD* GetBoard() const
    +virtual PCB_LAYER_ID GetLayer() const
    +virtual void SetLayer(PCB_LAYER_ID aLayer)
    +virtual LSET GetLayerSet() const
    +virtual void SetLayerSet(LSET aLayers)
    +virtual VECTOR2I GetPosition() const
    +virtual void SetPosition(const VECTOR2I& aPos)
    +virtual void Move(const VECTOR2I& aMoveVector)
    +virtual void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle)
    +virtual void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight)
    +STROKE_PARAMS GetStroke() const
    +void SetStroke(const STROKE_PARAMS& aStroke)
    #BOARD* m_board
}

3. BOARD_CONNECTED_ITEM (有网络连接的PCB项目)

c++ 复制代码
class BOARD_CONNECTED_ITEM {
    +BOARD_CONNECTED_ITEM(BOARD_ITEM* aParent, KICAD_T aType)
    +virtual ~BOARD_CONNECTED_ITEM()
    +NETINFO_ITEM* GetNet() const
    +void SetNet(NETINFO_ITEM* aNetinfo)
    +int GetNetCode() const
    +void SetNetCode(int aNetCode)
    +const wxString& GetNetname() const
    +void SetNetCode(int aNetCode, bool aNoLock)
    +virtual bool ConnectionPropagatesTo(const BOARD_ITEM* aItem) const
    #NETINFO_ITEM* m_netinfo
    #int m_netCode
}

4. BOARD (PCB板容器)

c++ 复制代码
class BOARD {
    +BOARD()
    +~BOARD()
    +FOOTPRINT* GetFirstFootprint() const
    +FOOTPRINT* GetFootprint(const wxString& aReference) const
    +void Add(BOARD_ITEM* aItem, ADD_MODE aMode)
    +void Remove(BOARD_ITEM* aItem)
    +TRACK* GetFirstTrack() const
    +ZONE* GetFirstZone() const
    +NETINFO_ITEM* FindNet(int aNetCode) const
    +NETINFO_ITEM* GetNetInfo()
    +const PCB_PLOT_PARAMS& GetPlotOptions() const
    +void SetPlotOptions(const PCB_PLOT_PARAMS& aOptions)
    +const PAGE_INFO& GetPageSettings() const
    +void SetPageSettings(const PAGE_INFO& aPageSettings)
    +const TITLE_BLOCK& GetTitleBlock() const
    +void SetTitleBlock(const TITLE_BLOCK& aTitleBlock)
    +const BOARD_DESIGN_SETTINGS& GetDesignSettings() const
    +BOARD_DESIGN_SETTINGS& GetDesignSettings()
    +void BuildConnectivity()
    +int GetConnectivityAlgoVersion() const
    +int GetCopperLayerCount() const
    +LSET GetEnabledLayers() const
    +void SetEnabledLayers(LSET aLayerMask)
    +void SetBoardUse(APPEND_USAGE aUse)
    +APPEND_USAGE GetBoardUse() const
    #std::LIST~BOARD_ITEM*~ m_drawings
    #std::LIST~FOOTPRINT*~ m_footprints
    #std::LIST~TRACK*~ m_tracks
    #std::LIST~ZONE*~ m_zones
    #NETINFO_LIST m_NetInfo
    #BOARD_DESIGN_SETTINGS m_designSettings
    #PCB_PLOT_PARAMS m_plotOptions
    #LSET m_enabledLayers
}

5. FOOTPRINT (封装/元件)

c++ 复制代码
class FOOTPRINT {
    +FOOTPRINT(BOARD* aParent)
    +~FOOTPRINT()
    +const wxString& GetReference() const
    +void SetReference(const wxString& aReference)
    +const wxString& GetValue() const
    +void SetValue(const wxString& aValue)
    +VECTOR2I GetPosition() const
    +void SetPosition(const VECTOR2I& aPos)
    +EDA_ANGLE GetOrientation() const
    +void SetOrientation(const EDA_ANGLE& aAngle)
    +int GetPadCount() const
    +PAD* GetPad(int aIndex) const
    +PAD* FindPadByNumber(const wxString& aPadNumber) const
    +void Add(PAD* aPad)
    +void Remove(PAD* aPad)
    +FP_ID GetFPID() const
    +void SetFPID(const FP_ID& aFPID)
    +void SetPosition(const VECTOR2I& aPos) override
    +void Move(const VECTOR2I& aMoveVector) override
    +void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle) override
    +void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight) override
    +const std::vector~PAD*& Pads() const
    +const std::vector~BOARD_ITEM*& GraphicalItems() const
    +std::vector~BOARD_ITEM*& Models()
    #wxString m_reference
    #wxString m_value
    #FP_ID m_fpid
    #std::vector~PAD*~ m_pads
    #std::vector~BOARD_ITEM*~ m_graphicalItems
    #std::vector~FP_3DMODEL*~ m_3DModels
    #VECTOR2I m_pos
    #EDA_ANGLE m_orientation
}

6. PCB_TRACK (导线基类)

c++ 复制代码
class PCB_TRACK {
    +PCB_TRACK(BOARD_ITEM* aParent)
    +~PCB_TRACK()
    +VECTOR2I GetStart() const
    +void SetStart(const VECTOR2I& aStart)
    +VECTOR2I GetEnd() const
    +void SetEnd(const VECTOR2I& aEnd)
    +int GetWidth() const
    +void SetWidth(int aWidth)
    +virtual VECTOR2I GetPosition() const
    +virtual void SetPosition(const VECTOR2I& aPos)
    +virtual void Move(const VECTOR2I& aMoveVector)
    +virtual void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle)
    +virtual void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight)
    +virtual bool IsLocked() const
    +virtual void SetLocked(bool aLocked)
    #VECTOR2I m_start
    #VECTOR2I m_end
    #int m_width
}

7. PCB_VIA (过孔)

c++ 复制代码
class PCB_VIA {
    +PCB_VIA(BOARD_ITEM* aParent)
    +~PCB_VIA()
    +VIATYPE_TYPE GetViaType() const
    +void SetViaType(VIATYPE_TYPE aViaType)
    +int GetDrill() const
    +void SetDrill(int aDrill)
    +LSET GetLayerSet() const
    +void SetLayerSet(LSET aLayerSet)
    +PCB_LAYER_ID TopLayer() const
    +PCB_LAYER_ID BottomLayer() const
    +bool IsOnLayer(PCB_LAYER_ID aLayer) const
    +virtual void Move(const VECTOR2I& aMoveVector)
    +virtual void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle)
    +virtual void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight)
    #VIATYPE_TYPE m_viaType
    #int m_drill
}

8. PAD (焊盘)

c++ 复制代码
class PAD {
    +PAD(FOOTPRINT* aParent)
    +~PAD()
    +PADSTACK& GetPadstack()
    +const PADSTACK& GetPadstack() const
    +const wxString& GetNumber() const
    +void SetNumber(const wxString& aNumber)
    +PAD_ATTRIB GetAttribute() const
    +void SetAttribute(PAD_ATTRIB aAttribute)
    +PAD_SHAPE GetShape() const
    +void SetShape(PAD_SHAPE aShape)
    +VECTOR2I GetPosition() const
    +void SetPosition(const VECTOR2I& aPos)
    +EDA_ANGLE GetOrientation() const
    +void SetOrientation(const EDA_ANGLE& aAngle)
    +int GetDrillSize() const
    +void SetDrillSize(int aSize)
    +VECTOR2I GetDrillSizeX() const
    +VECTOR2I GetDrillSizeY() const
    +VECTOR2I GetSize() const
    +void SetSize(const VECTOR2I& aSize)
    +int GetRoundRectRadiusRatio() const
    +void SetRoundRectRadiusRatio(int aRadius)
    +int GetChamferRatio() const
    +void SetChamferRatio(int aRatio)
    +void SetChamferPositions(int aPositions)
    +int GetChamferPositions() const
    +virtual void Move(const VECTOR2I& aMoveVector)
    +virtual void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle)
    +virtual void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight)
    #wxString m_number
    #PADSTACK m_padstack
    #PAD_ATTRIB m_attribute
    #PAD_SHAPE m_shape
}

9. ZONE (铜皮区域)

c++ 复制代码
class ZONE {
    +ZONE(BOARD_ITEM* aParent)
    +~ZONE()
    +const SHAPE_POLY_SET& GetPoly() const
    +SHAPE_POLY_SET& GetPoly()
    +void SetPoly(const SHAPE_POLY_SET& aPoly)
    +int GetMinThickness() const
    +void SetMinThickness(int aMinThickness)
    +int GetThermalReliefGap() const
    +void SetThermalReliefGap(int aGap)
    +int GetThermalReliefSpokeWidth() const
    +void SetThermalReliefSpokeWidth(int aWidth)
    +ZONE_CONNECTION GetPadConnection() const
    +void SetPadConnection(ZONE_CONNECTION aConnection)
    +bool IsFilled() const
    +void SetIsFilled(bool isFilled)
    +const VECTOR2I& GetPosition() const
    +void SetPosition(const VECTOR2I& aPos)
    +LSET GetLayerSet() const
    +void SetLayerSet(LSET aLayerSet)
    +int GetPriority() const
    +void SetPriority(int aPriority)
    +virtual void Move(const VECTOR2I& aMoveVector)
    +virtual void Rotate(const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle)
    +virtual void Flip(const VECTOR2I& aCentre, bool aFlipLeftRight)
    +void Unfill()
    +bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer)
    #SHAPE_POLY_SET m_poly
    #SHAPE_POLY_SET m_FilledPolysList
    #int m_minThickness
    #int m_thermalReliefGap
    #int m_thermalReliefSpokeWidth
    #ZONE_CONNECTION m_padConnection
    #bool m_isFilled
    #int m_priority
}

类关系图

contains
contains
contains
contains
contains
contains
contains
references
belongs to
* * * * * * * <<基础类>>
EDA_ITEM
+KICAD_T Type()
+GetBoundingBox()
+HitTest()
<<PCB项目基类>>
BOARD_ITEM
+GetBoard()
+GetLayer()
+SetLayer()
+GetPosition()
+SetPosition()
+Move()
+Rotate()
+Flip()
<<有网络连接的PCB项目>>
BOARD_CONNECTED_ITEM
+GetNet()
+SetNet()
+GetNetCode()
+GetNetname()
<<PCB项目容器>>
BOARD_ITEM_CONTAINER
+Add()
+Remove()
+GetItems()
<<PCB板容器>>
BOARD
-m_drawings
-m_footprints
-m_tracks
-m_zones
-m_NetInfo
+Add()
+Remove()
+GetFirstFootprint()
+GetFirstTrack()
+FindNet()
+BuildConnectivity()
<<封装/元件>>
FOOTPRINT
-m_pads
-m_graphicalItems
-m_3DModels
+GetReference()
+SetReference()
+GetValue()
+GetPadCount()
+GetPad()
+Add()
+Remove()
<<导线>>
PCB_TRACK
-m_start
-m_end
-m_width
+GetStart()
+SetStart()
+GetEnd()
+SetEnd()
+GetWidth()
+SetWidth()
<<过孔>>
PCB_VIA
-m_viaType
-m_drill
+GetViaType()
+SetViaType()
+GetDrill()
+SetDrill()
+GetLayerSet()
+SetLayerSet()
<<弧形导线>>
PCB_ARC
+GetCenter()
+SetCenter()
+GetAngle()
+SetAngle()
<<焊盘>>
PAD
-m_number
-m_padstack
-m_attribute
-m_shape
+GetNumber()
+SetNumber()
+GetAttribute()
+SetAttribute()
+GetShape()
+SetShape()
+GetDrillSize()
+SetDrillSize()
+GetSize()
+SetSize()
<<铜皮区域>>
ZONE
-m_poly
-m_FilledPolysList
-m_priority
+GetPoly()
+SetPoly()
+GetMinThickness()
+GetThermalReliefGap()
+GetPadConnection()
+SetIsFilled()
+GetPriority()
<<图形形状>>
PCB_SHAPE
+GetShape()
+SetShape()
+GetCenter()
+GetRadius()
<<PCB文本>>
PCB_TEXT
+GetText()
+SetText()
+GetTextSize()
+SetTextSize()
<<网络信息>>
NETINFO_ITEM
-m_netCode
-m_netname
+GetNetCode()
+GetNetname()
+GetPadCount()
<<PCB标记>>
PCB_MARKER
+GetMarkerType()
+SetMarkerType()
<<PCB组>>
PCB_GROUP
+GetItems()
+AddItem()
+RemoveItem()

主要关系说明

1. 继承关系

  • EDA_ITEM: 所有EDA项目的基础类,提供类型识别和基本几何功能
  • BOARD_ITEM: PCB专用项目的基础类,添加了层管理和板级操作
  • BOARD_CONNECTED_ITEM: 具有网络连接的PCB项目,管理网络引用
  • BOARD_ITEM_CONTAINER: 可以包含其他项目的容器

2. 组合关系

  • BOARD 包含所有PCB项目:

    • FOOTPRINT(封装)
    • PCB_TRACK(导线)
    • ZONE(铜皮区域)
    • PCB_TEXT(文本)
    • PCB_MARKER(标记)
  • FOOTPRINT 包含:

    • PAD(焊盘)
    • PCB_SHAPE(图形元素)
    • PCB_TEXT(文本)
    • FP_3DMODEL(3D模型)

3. 关联关系

  • BOARD_CONNECTED_ITEM 关联 NETINFO_ITEM(网络引用)
  • 所有项目都关联到 BOARD(所属板)

4. 聚合关系

  • NETINFO_LIST 管理所有网络信息
  • BOARD_DESIGN_SETTINGS 管理设计规则
  • PCB_PLOT_PARAMS 管理绘图参数

特殊关系

1. 共享关联

多个项目可以引用同一个 NETINFO_ITEM,表示它们属于同一网络。

2. 递归组合

BOARD_ITEM_CONTAINER 支持递归包含,理论上支持无限嵌套(实际使用中通常只有两层:BOARD和FOOTPRINT)。

3. 观察者模式

BOARD 维护连通性信息,当项目变化时通知相关系统更新。

4. 工厂模式

通过 KICAD_T 类型标识符和 ClassOf() 方法实现类型安全的运行时类型识别。

设计原则

1. 单一职责

每个类都有明确的职责:

  • BOARD: 板级容器和管理
  • FOOTPRINT: 封装容器
  • 具体项目类: 特定类型的PCB对象

2. 开闭原则

通过继承扩展功能,不需要修改基类:

  • 新的导线类型可以继承自 PCB_TRACK
  • 新的封装类型可以继承自 FOOTPRINT

3. 里氏替换原则

子类可以替换父类使用,保持接口一致性。

4. 依赖倒置

高层模块(如 PCB_EDIT_FRAME)依赖于抽象接口(BOARD_ITEM),而非具体实现。

5. 接口隔离

通过虚函数提供清晰的接口,类只暴露必要的方法。

性能优化

1. 内存管理

  • 使用智能指针管理复杂对象
  • 延迟加载大型资源(如3D模型)
  • 对象池重用常见对象

2. 渲染优化

  • 层次化细节(LOD)支持
  • 视口裁剪
  • 缓存计算结果(如边界框)

3. 并发支持

  • 多线程区域填充
  • 互斥锁保护关键数据结构
  • 读写锁支持并发访问

扩展性

1. 自定义项目

通过继承 BOARD_ITEM 可以添加新的PCB项目类型。

2. 自定义封装

通过继承 FOOTPRINT 可以创建特殊封装类型。

3. 插件系统

支持外部插件扩展功能。


本文档基于KiCad源码分析生成,反映了主要类的结构和关系。

相关推荐
im_AMBER1 小时前
Leetcode 139 最后一个单词的长度 | 找出字符串中第一个匹配项的下标
开发语言·算法·leetcode
Frostnova丶2 小时前
(6)LeetCode.42 接雨水
数据结构·算法·leetcode
像污秽一样2 小时前
算法设计与分析-习题4.4
数据结构·算法·排序算法·深度优先
战场小包2 小时前
向日葵MCP实践指南
人工智能·agent·mcp
x_xbx2 小时前
LeetCode:102. 二叉树的层序遍历
算法·leetcode
2401_889884662 小时前
嵌入式C++测试框架
开发语言·c++·算法
明月(Alioo)2 小时前
OpenClaw 从本地到云端:阿里云百炼免费模型配置实战指南
阿里云·ai·aigc·agent
月明长歌2 小时前
【码道初阶-Hot100】LeetCode 128. 最长连续序列:从排序双指针扫描到 HashSet,一文讲透为什么 O(n) 解法要用哈希
算法·leetcode·哈希算法
Z9fish2 小时前
C语言算法专题总结(一)排序
c语言·算法·排序算法