KiCad 插件系统简介

KiCad 插件系统是一个使用共享库扩展 KiCad 功能的框架。 使用插件的一个主要优点是在开发插件时没有必要重建 KiCad 套件; 事实上,可以借助 KiCad 源代码树中的一小组标题构建插件。 通过确保开发人员仅编译与正在开发的插件直接相关的代码,从而减少每个构建和测试周期所需的时间,在插件开发期间删除构建 KiCad 的要求极大地提高了工作效率。

插件最初是为 3D 模型查看器开发的,因此可以支持更多类型的 3D 模型,而无需对支持的每种新模型类型的 KiCad 源进行重大更改。 插件框架后来被推广,以便将来开发人员可以创建不同类型的插件。 目前,只有 3D 插件在 KiCad 中实现,但可以想象最终将开发 PCB 插件,以使用户能够实现数据导入器和导出器。

插件类

插件分为插件类,因为每个插件都解决了特定域中的问题,因此需要该域独有的接口。 例如,3D 模型插件从文件加载 3D 模型数据并将该数据转换为可由 3D 查看器显示的格式。 PCB 导入/导出插件将获取 PCB 数据并导出为其他电气或机械数据格式,或将外部格式转换为 KiCad PCB。 目前只开发了 3D 插件类,它将成为本文档的重点。

实现插件类需要在 KiCad 源代码树中创建代码来管理插件代码的加载。在 KiCad 源代码树中,文件 ‘plugins/ldr/pluginldr.h’ 声明了所有插件加载器的基类。这个类声明了我们期望在任何 KiCad 插件(样板代码)中找到的最基本的函数,它的实现提供了对插件加载器和可用插件之间的版本兼容性的基本检查。标题 ‘plugins/ldr/3d/pluginldr3D.h’ 声明了 3D 插件类的加载器。加载器负责加载给定的插件并使其功能可用于 KiCad。插件加载器的每个实例代表一个实际的插件实现,并充当 KiCad 和插件功能之间的透明桥梁。加载器不是 KiCad 中支持插件所需的唯一代码:我们还需要代码来发现插件和代码,以通过插件加载器调用插件的功能。在 3D 插件的情况下,发现和调用功能都包含在 S3D_CACHE 类中。

除非正在开发新的插件类,否则插件开发人员不需要关心 KiCad 管理插件的内部代码的细节; 插件只需要定义其特定插件类声明的函数。

标题 ‘include/plugins/kicad_plugin.h’ 声明了所有 KiCad 插件所需的泛型函数; 这些函数标识插件类,提供特定插件的名称,提供插件类 API 的版本信息,提供特定插件的版本信息,并提供插件类 API 的基本版本兼容性检查。 简而言之,这些功能是:

  1. /* 返回命名插件类的 UTF-8 字符串 */
  2. /* Return a UTF-8 string naming the Plugin Class */
  3. char const* GetKicadPluginClass( void );
  4. /* 返回插件类API的版本信息 */
  5. /* Return version information for the Plugin Class API */
  6. void GetClassVersion( unsigned char* Major, unsigned char* Minor,
  7. unsigned char* Patch, unsigned char* Revision );
  8. /*
  9. 如果插件中实现了版本检查,则返回 true。
  10. 确定给定的插件类 API 是否兼容。
  11. Return true if the version check implemented in the plugin
  12. determines that the given Plugin Class API is compatible.
  13. */
  14. bool CheckClassVersion( unsigned char Major,
  15. unsigned char Minor, unsigned char Patch, unsigned char Revision );
  16. /* 返回具体插件的名称,例如 “PLUGIN_3D_VRML” */
  17. /* Return the name of the specific plugin, for example "PLUGIN_3D_VRML" */
  18. const char* GetKicadPluginName( void );
  19. /* 返回特定插件的版本信息 */
  20. /* Return version information for the specific plugin */
  21. void GetPluginVersion( unsigned char* Major, unsigned char* Minor,
  22. unsigned char* Patch, unsigned char* Revision );

插件类:PLUGIN_3D

标题 ‘include/plugins/3d/3d_plugin.h’ 声明了必须由所有 3D 插件实现的函数,并定义了插件所需的许多函数以及用户不得重新实现的函数。 用户不得重新现的已定义函数是:

  1. /* 返回插件类名 “PLUGIN_3D” */
  2. /* Returns the Plugin Class name "PLUGIN_3D" */
  3. char const* GetKicadPluginClass( void );
  4. /* 返回 PLUGIN_3D API 的版本信息 */
  5. /* Return version information for the PLUGIN_3D API */
  6. void GetClassVersion( unsigned char* Major, unsigned char* Minor,
  7. unsigned char* Patch, unsigned char* Revision );
  8. /*
  9. 执行由的开发人员强制执行的基本版本检查。
  10. PLUGIN_3D 类的加载器,如果。
  11. 检查通过
  12. Performs basic version checks enforced by the developers of
  13. the loader for the PLUGIN_3D class and returns true if the
  14. checks pass
  15. */
  16. bool CheckClassVersion( unsigned char Major, unsigned char Minor,
  17. unsigned char Patch, unsigned char Revision );

用户必须实现的功能如下:

  1. /* 返回插件支持的扩展字符串数 */
  2. /* Return the number of extension strings supported by the plugin */
  3. int GetNExtensions( void );
  4. /*
  5. 返回请求的扩展字符串;有效值为 0 到
  6. GetNExtensions() - 1
  7. Return the requested extension string; valid values are 0 to
  8. GetNExtensions() - 1
  9. */
  10. char const* GetModelExtension( int aIndex );
  11. /* 返回插件支持的文件过滤器总数 */
  12. /* Return the total number of file filters supported by the plugin */
  13. int GetNFilters( void );
  14. /*
  15. 返回请求的文件筛选器;有效值为 0 到。
  16. GetNFilters() - 1
  17. Return the file filter requested; valid values are 0 to
  18. GetNFilters() - 1
  19. */
  20. char const* GetFileFilter( int aIndex );
  21. /*
  22. 如果插件可以渲染这种类型的 3D 模型,则返回 true。
  23. 在某些情况下,插件可能尚未提供可视模型。
  24. 并且必须返回 false。
  25. Return true if the plugin can render this type of 3D model.
  26. In some cases a plugin may not yet provide a visual model
  27. and must return false.
  28. */
  29. bool CanRender( void );
  30. /* 加载指定的模型并返回指向其可视化模型数据的指针 */
  31. /* Load the specified model and return a pointer to its visual model data */
  32. SCENEGRAPH* Load( char const* aFileName );