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源码分析生成,反映了主要类的结构和关系。