“很多小伙伴都想自己開發(fā) KiCad 插件,但不知從何入手。本文由華秋電子的另一位 KiCad 開發(fā)者波波同學(xué)撰寫,分享了如何快速搭建環(huán)境,并開發(fā)一個(gè)簡單的插件。”

所有環(huán)境配置成功,接下來可以寫我們的python插件了。按照 kicad官方開發(fā)手冊,實(shí)現(xiàn)一個(gè)顯示PCB對應(yīng)圖層的插件:
https://dev-docs.kicad.org/zh-cn/apis-and-binding/pcbnew/index.html
插件文件夾結(jié)構(gòu)如下:
-
kicad_plugin/#插件目錄(Python包)
-
- __init__.py #此文件在導(dǎo)入軟件包時(shí)執(zhí)行(在Pcbnew啟動(dòng)時(shí))
-
- __main__.py #調(diào)試python代碼時(shí)使用
-
- action_plugin.py # ActionPlugin派生類位于此處
-
- icon.png #插件圖標(biāo)
-
- main_frame_view.py #其他Python代碼
-
- ui_main_frame.fbp # wxformbuilder生成的源代碼
-
- ui_main_frame.py # wxformbuilder生成的python代碼
[插件示例倉庫]:
https://github.com/Huaqiu-Electronics/my-kicad-plugin.git
代碼實(shí)現(xiàn)
1、插件頁面布局。
上文通過wxformbuilder生成了ui_main_frame.py的UiMainFrame類。新建 main_frame_view.py 文件,定義一個(gè)名為MainFrameView的類,它繼承自UiMainFrame,MainFrameView 繼承了 UiMainFrame 的所有屬性和方法。初始化一個(gè)帶有兩列的self.data_view_list控件,并設(shè)置列的樣式。
-
AppendTextColumn()
方法用于向DataView
中添加一個(gè)文本列。
fromui_main_frameimportUiMainFrame
classMainFrameView(UiMainFrame):
def__init__(self, parent):
super().__init__(parent)
self.data_view_list.AppendTextColumn(
"ID",
0,
width=50,
align=wx.ALIGN_CENTER,
flags=dv.DATAVIEW_COL_RESIZABLE,
)
self.data_view_list.AppendTextColumn(
"Layer",
1,
width=170,
align=wx.ALIGN_CENTER,
flags=dv.DATAVIEW_COL_RESIZABLE,
)
2、加載PCB對象。
首先嘗試獲取當(dāng)前 PCB 文件的文件名。pcbnew.GetBoard()
返回當(dāng)前加載的 PCB 對象,并將 PCB 對象賦值給self.board 。如果加載失敗,則嘗試加載一個(gè)指定路徑的文件,使用pcbnew.LoadBoard() 方法加載該pcb文件,并將返回的 PCB 對象賦值給 self.board。
try:
#通過 kicad 打開插件時(shí)調(diào)用
pcbnew.GetBoard().GetFileName()
self.board = pcbnew.GetBoard()
exceptExceptionase:
# VSCode 調(diào)試插件時(shí)調(diào)用
fp ="C:\Program Files\demos\flat_hierarchy\flat_hierarchy.kicad_pcb"# Replace with your own PCB file path.
ifos.path.exists(fp):
self.board = pcbnew.LoadBoard(fp)
else:
print("File not find")
3、從 KiCad 的 PCB 文件中獲取可見圖層的信息,并將這些信息添加到一個(gè)DataView
控件中。
-
GetVisibleLayers() 方法返回一個(gè)包含所有可見圖層的集合。
-
GAL_LayerSet 是用于管理KiCad 圖層的類。
-
gal_set.Seq() 返回一個(gè)包含所有可見圖層編號(hào)的序列。
-
AppendItem(data) 方法將 data 列表中的內(nèi)容作為一行添加到 DataView 控件中。
deffill_list_data(self):
data = []
gal_set = self.board.GetVisibleLayers()
fornumin[xforxingal_set.Seq()]:
layerName = self.board.GetLayerName(num)
data = [str( num ), layerName ]
self.data_view_list.AppendItem(data)
4、顯示特定圖層的實(shí)現(xiàn)。
on_show_layer()
方法是一個(gè)事件處理函數(shù),用于在 KiCad 的 GUI 中顯示或隱藏特定的圖層。on_show_layer() 方法與一個(gè)事件項(xiàng)關(guān)聯(lián)綁定,當(dāng)用戶觸發(fā)該事件時(shí),它會(huì)根據(jù)用戶在DataView
控件中的選擇來顯示特定圖層。
- GetSelectedRow()方法返回當(dāng)前選中的行索引。
- GetValue(row, column)方法獲取指定行和列的值。
- SetVisibleLayers(gal_set)設(shè)置可見圖層集合。
-
UpdateUserInterface()方法更新 KiCad 的用戶界面,以反映圖層的更改。
使用def on_show_layer(self, event):
selection = self.data_view_list.GetSelectedRow()
item_data = self.data_view_list.GetValue(selection,0)
self.board.SetVisibleAlls()
gal_set = self.board.GetVisibleLayers()
for num in [x for x in gal_set.Seq()]:
ifstr(num) == item_data:
continue
gal_set.removeLayer(num)
self.board.SetVisibleLayers(gal_set)
pcbnew.UpdateUserInterface()
wx.CallAfter(pcbnew.Refresh)
event.Skip()
pass
wx.dataview.DataViewCtrl
的Bind
方法來綁定事件處理函數(shù)。通過單擊事件調(diào)用 on_show_layer() 方法。-
dv.EVT_DATAVIEW_SELECTION_CHANGED 是一個(gè)事件類型,表示用戶通過單擊激活數(shù)據(jù)項(xiàng)。
self.data_view_list.Bind(
dv.EVT_DATAVIEW_SELECTION_CHANGED,self.on_show_layer
)
5、啟動(dòng)一個(gè)基于wxPython
的獨(dú)立應(yīng)用程序。
在__main__.py中啟動(dòng)插件。從 wx 模塊中導(dǎo)入 App 類,定義一個(gè)名為StandAloneApp的類繼承自 App。StandAloneApp用于管理應(yīng)用程序的生命周期,并在主程序中實(shí)例化該類,顯示主窗口。
-
Show()
方法顯示主窗口。 -
app.MainLoop()
方法啟動(dòng)應(yīng)用程序的主事件循環(huán)。MainLoop
負(fù)責(zé)處理用戶交互、窗口更新等事件。
fromwximportApp
classStandAloneApp(App):
# StandAloneApp 類繼承自 wx.App。用于管理應(yīng)用程序的生命周期。
def__init__(self):
super().__init__()
if__name__ =="__main__":
app = StandAloneApp()
frommain_frame_viewimportMainFrameView
MainFrameView(None).Show()
app.MainLoop()
6、通過VSCode調(diào)試KiCad插件,在__main__.py頁面下,點(diǎn)擊“Python Debugger:Debuge Python File”,出現(xiàn)GUI圖形界面則表示運(yùn)行成功。到這里KiCad插件調(diào)試成功。

7、定義 KiCad 插件。
action_plugin.py 定義一個(gè)名為 Plugin 的類,繼承自 pcbnew.ActionPlugin。ActionPlugin 是 KiCad 提供的基類,用于創(chuàng)建插件。當(dāng)用戶通過菜單或工具欄按鈕觸發(fā)插件時(shí),Run() 方法被調(diào)用,顯示插件的主界面。
- self.name設(shè)置插件的名稱,顯示在 KiCad 的菜單或工具欄中。
- self.category設(shè)置插件的類別,用于在 KiCad 的菜單中組織插件。
-
self.description 插件的功能描述,顯示在 KiCad 的插件管理器中。
-
self.icon_file_name 設(shè)置插件的圖標(biāo)文件路徑。
-
self.dark_icon_file_name 設(shè)置插件的深色模式圖標(biāo)文件路徑。
importpcbnew
importos
importwx
# 插件入口
classPlugin(pcbnew.ActionPlugin):
def__init__(self):
self.name ="MyPlugin"# 插件名稱
self.category ="Manufacturing"# 描述性類別名稱
self.description ="To show or to hide layer."# 對插件及其功能的描述
self.show_toolbar_button =True# 可選,默認(rèn)為 False
self.icon_file_name = os.path.join(os.path.dirname(__file__),"icon.png") # 可選,默認(rèn)為 ""
self.dark_icon_file_name = os.path.join(os.path.dirname(__file__),"icon.png")
defRun(self):
frommain_frame_viewimportMainFrameView
MainFrameView(None).Show()
8、在kicad中加載和注冊插件。
__init__.py 文件,通過動(dòng)態(tài)修改sys.path
來確保插件模塊可以被正確導(dǎo)入,并調(diào)用插件的注冊方法。- PLUGIN_ROOT設(shè)置為當(dāng)前腳本文件所在的目錄路徑。
- Plugin().register() 創(chuàng)建Plugin類的一個(gè)實(shí)例,并調(diào)用該實(shí)例的register()方法注冊插件。
importsys
importos
PLUGIN_ROOT=os.path.dirname(os.path.abspath(__file__))
ifPLUGIN_ROOT not in sys.path:
sys.path.append(PLUGIN_ROOT)
from action_pluginimportPlugin
Plugin().register()
9、插件代碼完成之后就可以使用自己編寫的插件了。在PCB中打開“工具-->外部插件-->打開插件目錄”,進(jìn)入到插件目錄,將插件頁面放在kicad插件目錄下面:”C:UsershafDocumentsKiCad9.0scriptingplugins”或同級(jí)目錄下的”C:UsershafDocumentsKiCad9.03rdpartyplugins”。插件如下圖,通過點(diǎn)擊就可以顯示對應(yīng)的PCB圖層了。

結(jié)束語
編寫KiCad插件是一個(gè)需要深入了解KiCad API的過程,而且代碼的具體實(shí)現(xiàn)細(xì)節(jié)可能會(huì)比較復(fù)雜。如果你在開發(fā)過程中遇到具體的問題,可以查閱KiCad的 官方文檔或在相關(guān)的開發(fā)者社區(qū)尋求幫助。此外,確保你的代碼能夠適應(yīng)KiCad版本的更新,以保持插件的長期可用性。
另外,從 KiCad 9 開始,將逐漸使用 IPC API 逐漸取代原來的 SWIG 方式。詳情可以參考:KiCad 9 引入新的API機(jī)制。
-
插件
+關(guān)注
關(guān)注
0文章
340瀏覽量
22982 -
KiCAD
+關(guān)注
關(guān)注
5文章
244瀏覽量
9370 -
vscode
+關(guān)注
關(guān)注
1文章
169瀏覽量
8404
發(fā)布評論請先 登錄
用VSCode編寫自己的KiCad插件(上)詳細(xì)步驟教程

KiCad直播活動(dòng)(三):在 Windows上編譯KiCad 手把手教您編譯/構(gòu)建 KiCad 源碼

使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件實(shí)現(xiàn)自動(dòng)化代碼編程!

在 MAC mini4 上使用 VSCode 和 Cline 插件對接 Deepseek-R1:32b 的完整指南

KiCad 9.0.0 正式發(fā)布

KiCad 9 引入新的API機(jī)制

KiCon演講回顧(二):華秋 KiCad 發(fā)行版
KiCad插件大全
VSCode批量遷移插件

VSCode插件的安裝和使用

評論