0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用 VSCode 编写自己的 KiCad 插件(下)

KiCad 来源:KiCad 作者:KiCad 2025-06-19 11:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

很多小伙伴都想自己开发 KiCad 插件,但不知从何入手。本文由华秋电子的另一位 KiCad 开发者波波同学撰写,分享了如何快速搭建环境,并开发一个简单的插件。

wKgZPGhSNj2ACBiRAAYTeDU0iqI922.png

所有环境配置成功,接下来可以写我们的python插件了。按照 kicad官方开发手册,实现一个显示PCB对应图层的插件:

https://dev-docs.kicad.org/zh-cn/apis-and-binding/pcbnew/index.html

插件文件夹结构如下:

  • kicad_plugin/#插件目录(Python)

  • - __init__.py #此文件在导入软件包时执行(Pcbnew启动时)

  • - __main__.py #调试python代码时使用

  • - action_plugin.py # ActionPlugin派生类位于此处

  • - icon.png #插件图标

  • - 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

代码实现

1、插件页面布局。

上文通过wxformbuilder生成了ui_main_frame.pyUiMainFrame类。新建 main_frame_view.py 文件,定义一个名为MainFrameView的类,它继承自UiMainFrame,MainFrameView 继承了 UiMainFrame 的所有属性和方法。初始化一个带有两列的self.data_view_list控件,并设置列的样式。

  • AppendTextColumn()方法用于向DataView中添加一个文本列。

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对象。

首先尝试获取当前 PCB 文件的文件名。pcbnew.GetBoard()返回当前加载的 PCB 对象,并将 PCB 对象赋值给self.board 。如果加载失败,则尝试加载一个指定路径的文件,使用pcbnew.LoadBoard() 方法加载该pcb文件,并将返回的 PCB 对象赋值给 self.board。

   try:     #通过 kicad 打开插件时调用      pcbnew.GetBoard().GetFileName()     self.board = pcbnew.GetBoard()    exceptExceptionase:     # VSCode 调试插件时调用      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 文件中获取可见图层的信息,并将这些信息添加到一个DataView控件中

  • GetVisibleLayers() 方法返回一个包含所有可见图层的集合。

  • GAL_LayerSet 是用于管理KiCad 图层的类。

  • gal_set.Seq() 返回一个包含所有可见图层编号的序列。

  • AppendItem(data) 方法将 data 列表中的内容作为一行添加到 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、显示特定图层的实现。

on_show_layer()方法是一个事件处理函数,用于在 KiCad 的 GUI 中显示或隐藏特定的图层。on_show_layer() 方法与一个事件项关联绑定,当用户触发该事件时,它会根据用户在DataView控件中的选择来显示特定图层。

  • GetSelectedRow()方法返回当前选中的行索引
  • GetValue(row, column)方法获取指定行和列的值。
  • SetVisibleLayers(gal_set)设置可见图层集合。
  • 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.DataViewCtrlBind方法来绑定事件处理函数。通过单击事件调用 on_show_layer() 方法。
  • dv.EVT_DATAVIEW_SELECTION_CHANGED 是一个事件类型,表示用户通过单击激活数据项。

   self.data_view_list.Bind(      dv.EVT_DATAVIEW_SELECTION_CHANGED,self.on_show_layer    )

5、启动一个基于wxPython的独立应用程序。

__main__.py中启动插件。从 wx 模块中导入 App 类,定义一个名为StandAloneApp的类继承自 App。StandAloneApp用于管理应用程序的生命周期,并在主程序中实例化该类,显示主窗口。

  • Show()方法显示主窗口。

  • app.MainLoop()方法启动应用程序的主事件循环。MainLoop负责处理用户交互、窗口更新等事件。

fromwximportApp
classStandAloneApp(App): # StandAloneApp 类继承自 wx.App。用于管理应用程序的生命周期。 def__init__(self):   super().__init__()
if__name__ =="__main__":  app = StandAloneApp() frommain_frame_viewimportMainFrameView  MainFrameView(None).Show()  app.MainLoop()

6、通过VSCode调试KiCad插件,在__main__.py页面下,点击Python Debugger:Debuge Python File”,出现GUI图形界面则表示运行成功。到这里KiCad插件调试成功。

wKgZPGhSNj6AXfkaAAKXiQRTdCU350.png

7、定义 KiCad 插件。

action_plugin.py 定义一个名为 Plugin 的类,继承自 pcbnew.ActionPlugin。ActionPlugin 是 KiCad 提供的基类,用于创建插件。当用户通过菜单或工具栏按钮触发插件时,Run() 方法被调用,显示插件的主界面。

  • self.name设置插件的名称,显示在 KiCad 的菜单或工具栏中。
  • self.category设置插件的类别,用于在 KiCad 的菜单中组织插件。
  • self.description 插件的功能描述,显示在 KiCad 的插件管理器中。

  • self.icon_file_name 设置插件的图标文件路径。

  • self.dark_icon_file_name 设置插件的深色模式图标文件路径。

importpcbnewimportosimportwx
# 插件入口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# 可选,默认为 False    self.icon_file_name = os.path.join(os.path.dirname(__file__),"icon.png") # 可选,默认为 ""    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 文件,通过动态修改sys.path来确保插件模块可以被正确导入,并调用插件的注册方法。
  • PLUGIN_ROOT设置为当前脚本文件所在的目录路径。
  • Plugin().register() 创建Plugin类的一个实例,并调用该实例的register()方法注册插件
importsysimportos
PLUGIN_ROOT=os.path.dirname(os.path.abspath(__file__))
ifPLUGIN_ROOT not in sys.path:  sys.path.append(PLUGIN_ROOT)
from action_pluginimportPluginPlugin().register()

9、插件代码完成之后就可以使用自己编写的插件了。在PCB中打开“工具-->外部插件-->打开插件目录”,进入到插件目录,将插件页面放在kicad插件目录下面:”C:UsershafDocumentsKiCad9.0scriptingplugins或同级目录下的C:UsershafDocumentsKiCad9.03rdpartyplugins”。插件如下图,通过点击就可以显示对应的PCB图层了。

wKgZPGhSNj6AZkkyAAZZlRVfO5s414.png

结束语

编写KiCad插件是一个需要深入了解KiCad API的过程,而且代码的具体实现细节可能会比较复杂。如果你在开发过程中遇到具体的问题,可以查阅KiCad的 官方文档或在相关的开发者社区寻求帮助。此外,确保你的代码能够适应KiCad版本的更新,以保持插件的长期可用性。

另外,从 KiCad 9 开始,将逐渐使用 IPC API 逐渐取代原来的 SWIG 方式。详情可以参考:KiCad 9 引入新的API机制


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 插件
    +关注

    关注

    0

    文章

    345

    浏览量

    23422
  • KiCAD
    +关注

    关注

    5

    文章

    313

    浏览量

    10229
  • vscode
    +关注

    关注

    1

    文章

    171

    浏览量

    9008
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    KiCad 项目动态与 KiCad 10 版本亮点

    不惯英文的小伙伴可以看下面这个浓缩的中文版: 不想看视频的小伙伴可以看以下的思维导图,总结了所有核心内容: 最后我们 PPT 的形式整理核心内容:
    的头像 发表于 11-24 11:20 1570次阅读
    <b class='flag-5'>KiCad</b> 项目动态与 <b class='flag-5'>KiCad</b> 10 版本亮点

    vscode的rtthread micropython插件没有创建工程的图标,为什么?

    我想用micropython开发ESP32,请问我的vscode已经安装了RT-Thread micropython插件,为什么在下方没有创建micropython的“+”图标呢?
    发表于 09-28 13:13

    vscode环境安装了RT-Thread MicroPython插件下载点灯程序时显示无法解析machine是什么原因?

    请问在vscode环境安装了RT-Thread MicroPython插件下载点灯程序时显示无法解析machine是什么原因啊 ~!为啥thonny就能行,code就不行
    发表于 09-19 07:05

    华秋 KiCad 发行版 9.0.4 发布:属于您自己的云端器件库及模块电路库

    “  本次更新增加了个人中心,让您可以维护自己的云端器件库及模块电路库。同时增加了 PCB/SMT 下单功能,让您可以在 KiCad 里直接下单并追踪订单的进度。  ”   华秋发行版概览 华秋
    的头像 发表于 08-28 19:11 1.2w次阅读
    华秋 <b class='flag-5'>KiCad</b> 发行版 9.0.4 发布:属于您<b class='flag-5'>自己</b>的云端器件库及模块电路库

    STM32的時候是直接MDK方便还是在vscodekeil插件方便一些?

    STM32的時候是直接MDK方便還是在vscodekeil插件方便一些
    发表于 08-12 08:02

    2025 KiCon Asia KiCad 用户大会

    正在寻找的主题:- 从其他 EDA 软件转到 KiCad 的故事- 库管理- 封装设计技巧- KiCad 推广- KiCad 插件开发- 项目管理- 功能讨论- 自定义 DRC 使用案
    发表于 07-23 15:33

    CW32L010 MCU在VSCode+GCC+EIDE+JLink的使用示例

    CW32L010 MCU 在VSCode+GCC+ EIDE + JLink 的使用示例: 1、点击VSCode左边栏中的Extensions,在EXTENSIONS:MARKETPLACE搜索
    的头像 发表于 07-01 14:52 815次阅读
    CW32L010 MCU在<b class='flag-5'>VSCode</b>+GCC+EIDE+JLink<b class='flag-5'>下</b>的使用示例

    KiCad-Parasitics:KiCad 寄生参数分析插件

    “   这是一款用于分析 PCB 编辑器中走线(wires)寄生参数的插件。   ”     要使用该插件,您必须在电路板上标记两个点。通常情况,最好是选择由同一根走线连接的两个焊盘。标记后,该
    的头像 发表于 06-25 11:14 1773次阅读
    <b class='flag-5'>KiCad</b>-Parasitics:<b class='flag-5'>KiCad</b> 寄生参数分析<b class='flag-5'>插件</b>

    VSCode编写自己KiCad插件(上)详细步骤教程

    “  很多小伙伴都想自己开发 KiCad 插件,但不知从何入手。本文由华秋电子的另一位 KiCad 开发者波波同学撰写,分享了如何快速搭建环境,并开发一个简单的
    的头像 发表于 06-17 11:10 2736次阅读
    <b class='flag-5'>用</b><b class='flag-5'>VSCode</b><b class='flag-5'>编写</b><b class='flag-5'>自己</b>的<b class='flag-5'>KiCad</b><b class='flag-5'>插件</b>(上)详细步骤教程

    KiCad直播活动(三):在 Windows上编译KiCad 手把手教您编译/构建 KiCad 源码

    KiCad 贴纸,赶紧报名参加吧~ 直播安排 在 Windows 上编译 KiCad 时间:3月27日 19:30 内容:手把手帮助您从头开始学习编译 KiCad 代码。 后续精彩内容:
    的头像 发表于 03-24 11:14 1394次阅读
    <b class='flag-5'>KiCad</b>直播活动(三):在 Windows上编译<b class='flag-5'>KiCad</b> 手把手教您编译/构建 <b class='flag-5'>KiCad</b> 源码

    使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件实现自动化代码编程!

    。结合 Visual Studio Code(VSCode)的 Cline 插件,开发者可以实现高效的自动化代码编程。本文将详细介绍如何配置和使用 QWQ:32B 模型与 Cline 插件,以提升编程
    的头像 发表于 03-21 18:12 1086次阅读
    使用 QWQ:32B 模型搭配 <b class='flag-5'>VSCode</b> 的 Cline <b class='flag-5'>插件</b>实现自动化代码编程!

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

    可以在 MAC mini4 上高效地编写和调试代码。本教程将详细介绍如何在 MAC mini4 上配置 VSCode 和 Cline 插件,并成功对接 Deepseek-R1:32b,帮助您提升开发效率
    的头像 发表于 03-11 17:14 1366次阅读
    在 MAC mini4 上使用 <b class='flag-5'>VSCode</b> 和 Cline <b class='flag-5'>插件</b>对接 Deepseek-R1:32b 的完整指南

    KiCad 9.0.0 正式发布

    /kicad/windows/stable/kicad-9.0.0-x86_64.exe 我们衷心感谢过去一年为 KiCad 作出贡献的每一位成员。无论您的贡献是编写代码、提交错误报告
    的头像 发表于 02-21 11:12 2710次阅读
    <b class='flag-5'>KiCad</b> 9.0.0 正式发布

    KiCad 9 引入新的API机制

    “  在FOSDEM 2025的演讲中,核心开发者Jon Evans揭秘了KiCad 9的全新API系统,彻底重构插件生态,为开发者与用户带来更稳定、高效的体验。   ” 旧系统痛点:Python
    的头像 发表于 02-10 11:13 1975次阅读
    <b class='flag-5'>KiCad</b> 9 引入新的API机制

    KiCad 9 探秘(二):多通道设计工具

    “  Replicate Layout 插件终于可以淘汰了。KiCad 9 自带了多通道设计工具,比 Replicate Layout 更强大,更稳定!   ” 又是一个千呼万唤始出来的功能,熟悉
    的头像 发表于 01-03 11:21 4683次阅读
    <b class='flag-5'>KiCad</b> 9 探秘(二):多通道设计工具