应用程序编程接口(API)

插件通过应用程序编程接口(API)实现实现。 每个插件类都有其特定的 API,在 3D 插件教程中,我们已经看到了由标题 “3d_plugin.h” 声明的 3D 插件 API 实现的示例。 插件也可能依赖于 KiCad 源代码树中定义的其他 API; 在 3D 插件的情况下,支持模型可视化的所有插件必须与标题 ‘ifsg_all.h’ 及其包含的标题中声明的 Scene Graph API 交互。

本节描述了插件类实现可能需要的插件类 API 和其他 KiCad API 的详细信息。

插件类 API

目前只有一个为 KiCad 声明的插件类:3D 插件类。 所有 KiCad 插件类都必须实现头文件 ‘kicad_plugin.h’ 中声明的一组基本函数; 这些声明称为 Base Kicad 插件类。 不存在 Base Kicad 插件类的实现; 头文件的存在纯粹是为了确保插件开发人员在每个插件实现中实现这些定义的函数。

在 KiCad 中,插件加载器的每个实例都实现了插件提供的 API,就像插件加载器是提供插件服务的类一样。 这是通过 Plugin 加载器类实现的,该类提供包含与插件实现的类似的函数名的公共接口; 如果例如没有加载插件,则参数列表可以变化以适应向用户通知可能遇到的任何问题的需要。 在内部,插件加载器使用存储的指针指向每个 API 函数,以代表用户调用每个函数。

API:Base Kicad 插件类

Base Kicad 插件类由头文件 ‘kicad_plugin.h’ 定义。 此标头必须包含在所有其他插件类的声明中; 例如,请参阅头文件 ‘3d_plugin.h’ 中的 3D 插件类声明。 这些函数的原型在 《 plugin-classes(插件-类),Plugin Classes(插件类)》 中简要描述。 API 由 “pluginldr.cpp” 中定义的基本插件加载器实现。

为了帮助理解基本 KiCad 插件头所需的功能,我们必须查看基本插件 Loader 类中发生的情况。 Plugin Loader 类声明了一个虚函数 ‘Open()’,它接受要加载的插件的完整路径。 在特定的插件类加载器中实现 ‘Open()’ 函数最初将调用基本插件加载器的受保护的 ‘open()’ 函数; 这个基础 ‘open()’ 函数试图找到每个必需的基本插件函数的地址; 一旦检索到每个函数的地址,就会强制执行一些检查:

  1. 调用插件 ‘GetKicadPluginClass()’,并将结果与插件加载器实现提供的插件类字符串进行比较; 如果这些字符串不匹配,则打开的插件不适用于 Plugin Loader 实例。

  2. 调用插件 ‘GetClassVersion()’ 来检索插件实现的插件类 API 版本。

  3. 插件加载器虚拟 ‘GetLoaderVersion()’ 函数被调用以检索由加载器实现的插件类 API 版本。

  4. 插件和加载器报告的插件类 API 版本必须具有相同的主版本号,否则它们被认为是不兼容的。 这是最基本的版本测试,它由基本插件加载器强制执行。

  5. 使用插件加载器的插件类 API 版本信息调用插件 ‘CheckClassVersion()’; 如果插件支持给定版本,则返回 “true” 表示成功。 如果成功,加载器根据 ‘GetKicadPluginName()’ 和 ‘GetPluginVersion()’ 的结果创建一个 PluginInfo 字符串,插件加载过程在 Plugin Loader 的 ‘Open()’ 实现中继续。

API:3D 插件类

3D 插件类由头文件 ‘3d_plugin.h’ 声明,它扩展了所需的插件函数,如《class-plugin-3d(类-插件-3d),Plugin Class(插件类):PLUGIN_3D(插件_3D)》中所述。 相应的插件加载器在 ‘pluginldr3D.cpp’ 中定义,除了所需的 API 函数之外,加载器还实现了以下公共函数:

  1. /* 打开完整路径 "aFullFileName" 指定的插件 */
  2. /* Open the plugin specified by the full path "aFullFileName" */
  3. bool Open( const wxString& aFullFileName );
  4. /* 关闭当前打开的插件 */
  5. /* Close the currently opened plugin */
  6. void Close( void );
  7. /* 检索该插件加载器实现的插件类 API 版本 */
  8. /* Retrieve the Plugin Class API Version implemented by this Plugin Loader */
  9. void GetLoaderVersion( unsigned char* Major, unsigned char* Minor,
  10. unsigned char* Revision, unsigned char* Patch ) const;

所需的 3D 插件类功能通过以下功能公开:

  1. /* 如果没有加载插件,则返回插件类或 NULL */
  2. /* returns the Plugin Class or NULL if no plugin loaded */
  3. char const* GetKicadPluginClass( void );
  4. /* 如果没有加载插件,则返回 FALSE */
  5. /* returns false if no plugin loaded */
  6. bool GetClassVersion( unsigned char* Major, unsigned char* Minor,
  7. unsigned char* Patch, unsigned char* Revision );
  8. /* 如果类版本检查失败或未加载插件,则返回 FALSE */
  9. /* returns false if the class version check fails or no plugin is loaded */
  10. bool CheckClassVersion( unsigned char Major, unsigned char Minor,
  11. unsigned char Patch, unsigned char Revision );
  12. /* 返回插件名称,如果没有加载插件,则返回 NULL */
  13. /* returns the Plugin Name or NULL if no plugin loaded */
  14. const char* GetKicadPluginName( void );
  15. /*
  16. 如果未加载任何插件,则返回 False,否则返回参数。
  17. 包含 GetPluginVersion() 的结果。
  18. */
  19. /*
  20. returns false if no plugin is loaded, otherwise the arguments
  21. contain the result of GetPluginVersion()
  22. */
  23. bool GetVersion( unsigned char* Major, unsigned char* Minor,
  24. unsigned char* Patch, unsigned char* Revision );
  25. /*
  26. 如果没有加载插件,则将 aPluginInfo 设置为空字符串,
  27. 否则,将 aPluginInfo 设置为以下形式的字符串:
  28. [名称]:[主要].[次要].[修补程序].[修订版本]其中。
  29. name = 由 GetKicadPluginClass() 提供的名称。
  30. 主要、次要、修补程序、修订=版本信息来自。
  31. GetPluginVersion()。
  32. */
  33. /*
  34. sets aPluginInfo to an empty string if no plugin is loaded,
  35. otherwise aPluginInfo is set to a string of the form:
  36. [NAME]:[MAJOR].[MINOR].[PATCH].[REVISION] where
  37. NAME = name provided by GetKicadPluginClass()
  38. MAJOR, MINOR, PATCH, REVISION = version information from
  39. GetPluginVersion()
  40. */
  41. void GetPluginInfo( std::string& aPluginInfo );

在典型情况下,用户将执行以下操作:

  1. 创建 ‘KICAD_PLUGIN_LDR_3D’ 的实例。

  2. 调用 ‘Open(“/path/to/myplugin.so”)’ 来打开一个特定的插件。 必须检查返回值以确保根据需要加载插件。

  3. 调用由 ‘KICAD_PLUGIN_LDR_3D’ 公开的任何 3D 插件类调用。

  4. 调用 ‘Close()’来关闭(取消链接)插件。

  5. 销毁 ‘KICAD_PLUGIN_LDR_3D’ 实例。

场景图类 API

Scenegraph 类 API 由标题 ‘ifsg_all.h’ 及其包含的标题定义。 API 由许多辅助例程组成,命名空间为 ‘S3D’,在 ‘ifsg_api.h’ 中定义,包装类由各种 ‘ifsg_*.h’ 标题定义; 包装器支持底层的场景图类,它们一起形成一个与 VRML2.0 静态场景图兼容的场景图结构。 标题,结构,类及其公共函数如下:

sg_version.h

  1. /*
  2. 定义 SceneGraph 类的版本信息。
  3. 所有使用 Scenegraph 类的插件都应该包含这个头。
  4. 并对照所报告的版本检查版本信息。
  5. S3D::GetLibVersion() 以确保兼容性。
  6. */
  7. /*
  8. Defines version information of the SceneGraph Classes.
  9. All plugins which use the scenegraph class should include this header
  10. and check the version information against the version reported by
  11. S3D::GetLibVersion() to ensure compatibility
  12. */
  13. #define KICADSG_VERSION_MAJOR 2
  14. #define KICADSG_VERSION_MINOR 0
  15. #define KICADSG_VERSION_PATCH 0
  16. #define KICADSG_VERSION_REVISION 0

sg_types.h

  1. /*
  2. 定义 SceneGraph 类类型;这些类型。
  3. 与 VRML2.0 节点类型密切相关。
  4. */
  5. /*
  6. Defines the SceneGraph Class Types; these types
  7. are closely related to VRML2.0 node types.
  8. */
  9. namespace S3D
  10. {
  11. enum SGTYPES
  12. {
  13. SGTYPE_TRANSFORM = 0,
  14. SGTYPE_APPEARANCE,
  15. SGTYPE_COLORS,
  16. SGTYPE_COLORINDEX,
  17. SGTYPE_FACESET,
  18. SGTYPE_COORDS,
  19. SGTYPE_COORDINDEX,
  20. SGTYPE_NORMALS,
  21. SGTYPE_SHAPE,
  22. SGTYPE_END
  23. };
  24. };

‘sg_base.h’ 头包含 scenegraph 类使用的基本数据类型的声明。

sg_base.h

  1. /*
  2. 这是相当于 VRML2.0 的 RGB 颜色模型。
  3. RGB 模型,其中每种颜色可能在。
  4. 范围 [0..1]。
  5. */
  6. /*
  7. This is an RGB color model equivalent to the VRML2.0
  8. RGB model where each color may have a value within the
  9. range [0..1].
  10. */
  11. class SGCOLOR
  12. {
  13. public:
  14. SGCOLOR();
  15. SGCOLOR( float aRVal, float aGVal, float aBVal );
  16. void GetColor( float& aRedVal, float& aGreenVal, float& aBlueVal ) const;
  17. void GetColor( SGCOLOR& aColor ) const;
  18. void GetColor( SGCOLOR* aColor ) const;
  19. bool SetColor( float aRedVal, float aGreenVal, float aBlueVal );
  20. bool SetColor( const SGCOLOR& aColor );
  21. bool SetColor( const SGCOLOR* aColor );
  22. };
  23. class SGPOINT
  24. {
  25. public:
  26. double x;
  27. double y;
  28. double z;
  29. public:
  30. SGPOINT();
  31. SGPOINT( double aXVal, double aYVal, double aZVal );
  32. void GetPoint( double& aXVal, double& aYVal, double& aZVal );
  33. void GetPoint( SGPOINT& aPoint );
  34. void GetPoint( SGPOINT* aPoint );
  35. void SetPoint( double aXVal, double aYVal, double aZVal );
  36. void SetPoint( const SGPOINT& aPoint );
  37. };
  38. /*
  39. SGVECTOR 有 3 个分量(x,y,z)类似于一个点;但是。
  40. 向量确保存储的值是规范化的,并且。
  41. 防止直接操作组件变量。
  42. */
  43. /*
  44. A SGVECTOR has 3 components (x,y,z) similar to a point; however
  45. a vector ensures that the stored values are normalized and
  46. prevents direct manipulation of the component variables.
  47. */
  48. class SGVECTOR
  49. {
  50. public:
  51. SGVECTOR();
  52. SGVECTOR( double aXVal, double aYVal, double aZVal );
  53. void GetVector( double& aXVal, double& aYVal, double& aZVal ) const;
  54. void SetVector( double aXVal, double aYVal, double aZVal );
  55. void SetVector( const SGVECTOR& aVector );
  56. SGVECTOR& operator=( const SGVECTOR& source );
  57. };

‘IFSG_NODE’ 类是所有场景图节点的基类。 所有 scenegraph 对象都实现此类的公共函数,但在某些情况下,特定函数可能对特定类没有意义。

ifsg_node.h

  1. class IFSG_NODE
  2. {
  3. public:
  4. IFSG_NODE();
  5. virtual ~IFSG_NODE();
  6. /**
  7. * 功能销毁。
  8. * 删除此包装器持有的 Scenegraph 对象。
  9. */
  10. /**
  11. * Function Destroy
  12. * deletes the scenegraph object held by this wrapper
  13. */
  14. void Destroy( void );
  15. /**
  16. * 函数附加。
  17. * 将给定S GNODE* 与此包装器关联。
  18. */
  19. /**
  20. * Function Attach
  21. * associates a given SGNODE* with this wrapper
  22. */
  23. virtual bool Attach( SGNODE* aNode ) = 0;
  24. /**
  25. * 函数 NewNode。
  26. * 创建与此包装器关联的新节点。
  27. */
  28. /**
  29. * Function NewNode
  30. * creates a new node to associate with this wrapper
  31. */
  32. virtual bool NewNode( SGNODE* aParent ) = 0;
  33. virtual bool NewNode( IFSG_NODE& aParent ) = 0;
  34. /**
  35. * 函数 GetRawPtr()。
  36. * 返回原始内部SGNODE指针。
  37. */
  38. /**
  39. * Function GetRawPtr()
  40. * returns the raw internal SGNODE pointer
  41. */
  42. SGNODE* GetRawPtr( void );
  43. /**
  44. * 函数 GetNodeType。
  45. * 返回此节点实例的类型。
  46. */
  47. /**
  48. * Function GetNodeType
  49. * returns the type of this node instance
  50. */
  51. S3D::SGTYPES GetNodeType( void ) const;
  52. /**
  53. * 函数 GetParent。
  54. * 返回指向此对象的父 SGNODE 的指针。
  55. * 如果对象没有父对象,则为 NULL(即 顶级变换)。
  56. * 或者如果包装器当前未与 SGNODE 关联。
  57. */
  58. /**
  59. * Function GetParent
  60. * returns a pointer to the parent SGNODE of this object
  61. * or NULL if the object has no parent (ie. top level transform)
  62. * or if the wrapper is not currently associated with an SGNODE.
  63. */
  64. SGNODE* GetParent( void ) const;
  65. /**
  66. * 函数 SetParent。
  67. * 设置此对象的父 SGNODE。
  68. *
  69. * @param aParent [in] 是所需的父节点。
  70. * @return 如果操作成功,则返回 true;如果操作成功,则返回 false。
  71. * 给定节点不允许为父节点。
  72. * 派生对象。
  73. */
  74. /**
  75. * Function SetParent
  76. * sets the parent SGNODE of this object.
  77. *
  78. * @param aParent [in] is the desired parent node
  79. * @return true if the operation succeeds; false if
  80. * the given node is not allowed to be a parent to
  81. * the derived object.
  82. */
  83. bool SetParent( SGNODE* aParent );
  84. /**
  85. * 函数 GetNodeTypeName。
  86. * 返回节点类型的文本表示。
  87. * 如果节点不知何故具有无效类型,则为 NULL。
  88. */
  89. /**
  90. * Function GetNodeTypeName
  91. * returns the text representation of the node type
  92. * or NULL if the node somehow has an invalid type
  93. */
  94. const char * GetNodeTypeName( S3D::SGTYPES aNodeType ) const;
  95. /**
  96. * 函数 AddRefNode。
  97. * 添加对不属于的现有节点的引用。
  98. * (不是此节点的子节点)。
  99. *
  100. * @return 成功返回 true。
  101. */
  102. /**
  103. * Function AddRefNode
  104. * adds a reference to an existing node which is not owned by
  105. * (not a child of) this node.
  106. *
  107. * @return true on success
  108. */
  109. bool AddRefNode( SGNODE* aNode );
  110. bool AddRefNode( IFSG_NODE& aNode );
  111. /**
  112. * 函数 AddChildNode。
  113. * 添加一个节点作为此节点拥有的子节点。
  114. *
  115. * @return 成功返回 true。
  116. */
  117. /**
  118. * Function AddChildNode
  119. * adds a node as a child owned by this node.
  120. *
  121. * @return true on success
  122. */
  123. bool AddChildNode( SGNODE* aNode );
  124. bool AddChildNode( IFSG_NODE& aNode );
  125. };

‘IFSG_TRANSFORM’ 类似于 VRML2.0 Transform 节点; 它可以包含任意数量的子 IFSG_SHAPE 和 IFSG_TRANSFORM 节点以及任意数量的引用的 IFSG_SHAPE 和 IFSG_TRANSFORM 节点。 有效的场景图必须有一个 “IFSG_TRANSFORM” 对象作为根。

ifsg_transform.h

  1. /**
  2. * IFSG_Transform 类。
  3. *是 VRML 兼容转换块类 SCENEGRAPH 的包装。
  4. */
  5. /**
  6. * Class IFSG_TRANSFORM
  7. * is the wrapper for the VRML compatible TRANSFORM block class SCENEGRAPH
  8. */
  9. class IFSG_TRANSFORM : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_TRANSFORM( bool create );
  13. IFSG_TRANSFORM( SGNODE* aParent );
  14. bool SetScaleOrientation( const SGVECTOR& aScaleAxis, double aAngle );
  15. bool SetRotation( const SGVECTOR& aRotationAxis, double aAngle );
  16. bool SetScale( const SGPOINT& aScale );
  17. bool SetScale( double aScale );
  18. bool SetCenter( const SGPOINT& aCenter );
  19. bool SetTranslation( const SGPOINT& aTranslation );
  20. /* 此处未显示的各种基类函数 */
  21. /* various base class functions not shown here */
  22. };

‘IFSG_SHAPE’ 类似于 VRML2.0 Shape 节点; 它必须包含单个子节点或引用 FACESET 节点,并且可以包含单个子节点或引用 APPEARANCE 节点。

ifsg_shape.h

  1. /**
  2. * IFSG_SHAP E类。
  3. * 是 SGSHAPE 类的包装。
  4. */
  5. /**
  6. * Class IFSG_SHAPE
  7. * is the wrapper for the SGSHAPE class
  8. */
  9. class IFSG_SHAPE : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_SHAPE( bool create );
  13. IFSG_SHAPE( SGNODE* aParent );
  14. IFSG_SHAPE( IFSG_NODE& aParent );
  15. /* 此处未显示的各种基类函数 */
  16. /* various base class functions not shown here */
  17. };

‘IFSG_APPEARANCE’ 类似于 VRML2.0 Appearance 节点,但目前它只代表包含 Material 节点的 Appearance 节点的等价物。

ifsg_appearance.h

  1. class IFSG_APPEARANCE : public IFSG_NODE
  2. {
  3. public:
  4. IFSG_APPEARANCE( bool create );
  5. IFSG_APPEARANCE( SGNODE* aParent );
  6. IFSG_APPEARANCE( IFSG_NODE& aParent );
  7. bool SetEmissive( float aRVal, float aGVal, float aBVal );
  8. bool SetEmissive( const SGCOLOR* aRGBColor );
  9. bool SetEmissive( const SGCOLOR& aRGBColor );
  10. bool SetDiffuse( float aRVal, float aGVal, float aBVal );
  11. bool SetDiffuse( const SGCOLOR* aRGBColor );
  12. bool SetDiffuse( const SGCOLOR& aRGBColor );
  13. bool SetSpecular( float aRVal, float aGVal, float aBVal );
  14. bool SetSpecular( const SGCOLOR* aRGBColor );
  15. bool SetSpecular( const SGCOLOR& aRGBColor );
  16. bool SetAmbient( float aRVal, float aGVal, float aBVal );
  17. bool SetAmbient( const SGCOLOR* aRGBColor );
  18. bool SetAmbient( const SGCOLOR& aRGBColor );
  19. bool SetShininess( float aShininess );
  20. bool SetTransparency( float aTransparency );
  21. /* 此处未显示的各种基类函数 */
  22. /* various base class functions not shown here */
  23. /* 以下函数在。
  24. 外观节点,并始终返回失败代码
  25. /* the following functions make no sense within an
  26. appearance node and always return a failure code
  27. bool AddRefNode( SGNODE* aNode );
  28. bool AddRefNode( IFSG_NODE& aNode );
  29. bool AddChildNode( SGNODE* aNode );
  30. bool AddChildNode( IFSG_NODE& aNode );
  31. */
  32. };

‘IFSG_FACESET’ 类似于包含 IndexedFaceSet 节点的 VRML2.0 Geometry 节点。 它必须包含单个子节点或引用 COORDS 节点,单个子 COORDINDEX 节点以及单个子节点或引用 NORMALS 节点; 另外可能有一个子节点或引用 COLORS 节点。 提供简化的法线计算功能以帮助用户将正常值分配给表面。 与 VRML2.0 模拟的偏差如下:

  1. 法线始终是每个顶点。

  2. 颜色总是每个顶点。

  3. 坐标索引集必须仅描述三角形面。

ifsg_faceset.h

  1. /**
  2. * IFSG_FACESET 类。
  3. * 是 SGFACESET 类的包装。
  4. */
  5. /**
  6. * Class IFSG_FACESET
  7. * is the wrapper for the SGFACESET class
  8. */
  9. class IFSG_FACESET : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_FACESET( bool create );
  13. IFSG_FACESET( SGNODE* aParent );
  14. IFSG_FACESET( IFSG_NODE& aParent );
  15. bool CalcNormals( SGNODE** aPtr );
  16. /* 此处未显示的各种基类函数 */
  17. /* various base class functions not shown here */
  18. };

ifsg_coords.h

  1. /**
  2. * IFSG_COORDS 类别。
  3. * 是 SGCOORDS 的包装器。
  4. */
  5. /**
  6. * Class IFSG_COORDS
  7. * is the wrapper for SGCOORDS
  8. */
  9. class IFSG_COORDS : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_COORDS( bool create );
  13. IFSG_COORDS( SGNODE* aParent );
  14. IFSG_COORDS( IFSG_NODE& aParent );
  15. bool GetCoordsList( size_t& aListSize, SGPOINT*& aCoordsList );
  16. bool SetCoordsList( size_t aListSize, const SGPOINT* aCoordsList );
  17. bool AddCoord( double aXValue, double aYValue, double aZValue );
  18. bool AddCoord( const SGPOINT& aPoint );
  19. /* 此处未显示的各种基类函数 */
  20. /* various base class functions not shown here */
  21. /* 以下函数在。
  22. 协调节点并始终返回失败代码
  23. /* the following functions make no sense within a
  24. coords node and always return a failure code
  25. bool AddRefNode( SGNODE* aNode );
  26. bool AddRefNode( IFSG_NODE& aNode );
  27. bool AddChildNode( SGNODE* aNode );
  28. bool AddChildNode( IFSG_NODE& aNode );
  29. */
  30. };

‘IFSG_COORDINDEX’ 类似于 VRML2.0 coordIdx[] 集,除了它必须专门描述三角形面,这意味着索引的总数可以被 3 整除。

ifsg_coordindex.h

  1. /**
  2. * IFSG_COORDINDEX 类。
  3. * 是 SGCOORDINDEX 的包装。
  4. */
  5. /**
  6. * Class IFSG_COORDINDEX
  7. * is the wrapper for SGCOORDINDEX
  8. */
  9. class IFSG_COORDINDEX : public IFSG_INDEX
  10. {
  11. public:
  12. IFSG_COORDINDEX( bool create );
  13. IFSG_COORDINDEX( SGNODE* aParent );
  14. IFSG_COORDINDEX( IFSG_NODE& aParent );
  15. bool GetIndices( size_t& nIndices, int*& aIndexList );
  16. bool SetIndices( size_t nIndices, int* aIndexList );
  17. bool AddIndex( int aIndex );
  18. /* 此处未显示的各种基类函数 */
  19. /* various base class functions not shown here */
  20. /* 以下函数在。
  21. 协调节点并始终返回失败代码
  22. /* the following functions make no sense within a
  23. coordindex node and always return a failure code
  24. bool AddRefNode( SGNODE* aNode );
  25. bool AddRefNode( IFSG_NODE& aNode );
  26. bool AddChildNode( SGNODE* aNode );
  27. bool AddChildNode( IFSG_NODE& aNode );
  28. */
  29. };

‘IFSG_NORMALS’ 相当于 VRML2.0 Normals 节点。

ifsg_normals.h

  1. /**
  2. * IFSG_Normal 类。
  3. * 是 SGNORMALS 类的包装。
  4. */
  5. /**
  6. * Class IFSG_NORMALS
  7. * is the wrapper for the SGNORMALS class
  8. */
  9. class IFSG_NORMALS : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_NORMALS( bool create );
  13. IFSG_NORMALS( SGNODE* aParent );
  14. IFSG_NORMALS( IFSG_NODE& aParent );
  15. bool GetNormalList( size_t& aListSize, SGVECTOR*& aNormalList );
  16. bool SetNormalList( size_t aListSize, const SGVECTOR* aNormalList );
  17. bool AddNormal( double aXValue, double aYValue, double aZValue );
  18. bool AddNormal( const SGVECTOR& aNormal );
  19. /* 此处未显示的各种基类函数 */
  20. /* various base class functions not shown here */
  21. /* 以下函数在。
  22. 法线节点并始终返回失败代码
  23. /* the following functions make no sense within a
  24. normals node and always return a failure code
  25. bool AddRefNode( SGNODE* aNode );
  26. bool AddRefNode( IFSG_NODE& aNode );
  27. bool AddChildNode( SGNODE* aNode );
  28. bool AddChildNode( IFSG_NODE& aNode );
  29. */
  30. };

‘IFSG_COLORS’ 类似于 VRML2.0 colors[] 集。

ifsg_colors.h

  1. /**
  2. * IFSG_COLOR 类。
  3. * 是 SGCOLORS 的包装器。
  4. */
  5. /**
  6. * Class IFSG_COLORS
  7. * is the wrapper for SGCOLORS
  8. */
  9. class IFSG_COLORS : public IFSG_NODE
  10. {
  11. public:
  12. IFSG_COLORS( bool create );
  13. IFSG_COLORS( SGNODE* aParent );
  14. IFSG_COLORS( IFSG_NODE& aParent );
  15. bool GetColorList( size_t& aListSize, SGCOLOR*& aColorList );
  16. bool SetColorList( size_t aListSize, const SGCOLOR* aColorList );
  17. bool AddColor( double aRedValue, double aGreenValue, double aBlueValue );
  18. bool AddColor( const SGCOLOR& aColor );
  19. /* 此处未显示的各种基类函数 */
  20. /* various base class functions not shown here */
  21. /* 以下函数在。
  22. 法线节点并始终返回失败代码
  23. /* the following functions make no sense within a
  24. normals node and always return a failure code
  25. bool AddRefNode( SGNODE* aNode );
  26. bool AddRefNode( IFSG_NODE& aNode );
  27. bool AddChildNode( SGNODE* aNode );
  28. bool AddChildNode( IFSG_NODE& aNode );
  29. */
  30. };

其余的 API 函数在 ‘ifsg_api.h’ 中定义如下:

ifsg_api.h

  1. namespace S3D
  2. {
  3. /**
  4. * 函数 GetLibVersion 检索。
  5. * kicad_3dsg 库。
  6. */
  7. /**
  8. * Function GetLibVersion retrieves version information of the
  9. * kicad_3dsg library
  10. */
  11. SGLIB_API void GetLibVersion( unsigned char* Major, unsigned char* Minor,
  12. unsigned char* Patch, unsigned char* Revision );
  13. //从 SGNODE 指针提取信息的函数
  14. // functions to extract information from SGNODE pointers
  15. SGLIB_API S3D::SGTYPES GetSGNodeType( SGNODE* aNode );
  16. SGLIB_API SGNODE* GetSGNodeParent( SGNODE* aNode );
  17. SGLIB_API bool AddSGNodeRef( SGNODE* aParent, SGNODE* aChild );
  18. SGLIB_API bool AddSGNodeChild( SGNODE* aParent, SGNODE* aChild );
  19. SGLIB_API void AssociateSGNodeWrapper( SGNODE* aObject, SGNODE** aRefPtr );
  20. /**
  21. * 函数 CalcTriNorm
  22. * 返回顶点 p1,p2,p3 描述的三角形的法向量。
  23. */
  24. /**
  25. * Function CalcTriNorm
  26. * returns the normal vector of a triangle described by vertices p1, p2, p3
  27. */
  28. SGLIB_API SGVECTOR CalcTriNorm( const SGPOINT& p1, const SGPOINT& p2, const SGPOINT& p3 );
  29. /**
  30. * 函数 WriteCache
  31. * 将 SGNODE 树写入二进制缓存文件。
  32. *
  33. * @param aFileName 是要写入的文件的名称。
  34. * @param overwrite 必须设置为 true 才能覆盖现有文件。
  35. * @param 阳极是要写入的节点树中的任何节点。
  36. * @return 成功返回 true。
  37. */
  38. /**
  39. * Function WriteCache
  40. * writes the SGNODE tree to a binary cache file
  41. *
  42. * @param aFileName is the name of the file to write
  43. * @param overwrite must be set to true to overwrite an existing file
  44. * @param aNode is any node within the node tree which is to be written
  45. * @return true on success
  46. */
  47. SGLIB_API bool WriteCache( const char* aFileName, bool overwrite, SGNODE* aNode,
  48. const char* aPluginInfo );
  49. /**
  50. * 函数 ReadCache
  51. * 读取二进制缓存文件并创建 SGNODE 树。
  52. *
  53. * @param aFileName 是要读取的二进制缓存文件的名称。
  54. * @return 失败返回 NULL,成功返回顶层 SCENEGRAPH 节点指针;
  55. * 如果需要,此节点可以通过以下方式与 IFSG_Transform 包装器关联。
  56. * IFSG_Transform::Attach() 函数。
  57. */
  58. /**
  59. * Function ReadCache
  60. * reads a binary cache file and creates an SGNODE tree
  61. *
  62. * @param aFileName is the name of the binary cache file to be read
  63. * @return NULL on failure, on success a pointer to the top level SCENEGRAPH node;
  64. * if desired this node can be associated with an IFSG_TRANSFORM wrapper via
  65. * the IFSG_TRANSFORM::Attach() function.
  66. */
  67. SGLIB_API SGNODE* ReadCache( const char* aFileName, void* aPluginMgr,
  68. bool (*aTagCheck)( const char*, void* ) );
  69. /**
  70. * 函数 WriteVRML
  71. * 将给定节点及其子节点写出到 VRML2 文件。
  72. *
  73. * @param filename 是输出文件的名称。
  74. * @param overwrite 应设置为 true 以覆盖现有 VRML 文件。
  75. * @param aTopNode 是指向代表 VRML 场景的 SCENEGRAPH 对象的指针。
  76. * @param reuse 应设置为 true 以使用 VRML DEF/USE 功能。
  77. * @return 成功返回 true。
  78. */
  79. /**
  80. * Function WriteVRML
  81. * writes out the given node and its subnodes to a VRML2 file
  82. *
  83. * @param filename is the name of the output file
  84. * @param overwrite should be set to true to overwrite an existing VRML file
  85. * @param aTopNode is a pointer to a SCENEGRAPH object representing the VRML scene
  86. * @param reuse should be set to true to make use of VRML DEF/USE features
  87. * @return true on success
  88. */
  89. SGLIB_API bool WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode,
  90. bool reuse, bool renameNodes );
  91. // 注意:以下函数组合用于创建 VRML。
  92. // 组装,可以使用模块的每个 SG* 表示的各种实例。
  93. // 典型的用例是:
  94. // 1.调用 ‘ResetNodeIndex()’ 重置全局节点名索引。
  95. // 2.对于 ‘S3DCACHE->load()’ 提供的每个模型指针,调用一次 ‘RenameNodes()’;
  96. // 这可确保所有节点都有唯一的名称以呈现给最终输出文件。
  97. // 内部 RenameNodes() 只重命名给定节点和所有子节点;
  98. // 仅被引用的节点不会被重命名。使用提供的指针。
  99. // 通过 ‘S3DCACHE->load()’ 确保除了返回的节点(顶层节点)之外的所有节点都是。
  100. // 至少一个节点的子节点,因此所有节点都有唯一的名称。
  101. // 3.如果 SG* 树是独立于 S3DCACHE 创建的 -> load(),则用户必须调用。
  102. // RenameNodes() 以确保所有节点都具有唯一的名称。
  103. // 4.根据需要创建新的 ifsg_transform 节点来创建程序集结构。
  104. // 对于组件的每个实例;由返回的组件基础模型。
  105. // S3DCACHE->load() 可以通过 ‘AddRefNode()’ 添加到这些 IFSG_Transform 节点;
  106. // 设置 IFSG_Transform 节点的偏移、旋转等,确保正确。
  107. // 5.确保所有新的 IFSG_Transform 节点都作为子节点放置在。
  108. // 顶层 IFSG_Transform 节点,为最终节点命名和输出做准备。
  109. // 6.在顶层组装节点上调用 RenameNodes()。
  110. // 7.正常调用 WriteVRML(),renameNodes=false,写入整个程序集。
  111. // 结构转换为单个 VRML 文件。
  112. // 8.通过删除任何额外的 IFSG_Transform 包装器及其底层 SG* 进行清理。
  113. // 专门为程序集输出创建的类
  114. // NOTE: The following functions are used in combination to create a VRML
  115. // assembly which may use various instances of each SG* representation of a module.
  116. // A typical use case would be:
  117. // 1. invoke 'ResetNodeIndex()' to reset the global node name indices
  118. // 2. for each model pointer provided by 'S3DCACHE->Load()', invoke 'RenameNodes()' once;
  119. // this ensures that all nodes have a unique name to present to the final output file.
  120. // Internally, RenameNodes() will only rename the given node and all Child subnodes;
  121. // nodes which are only referenced will not be renamed. Using the pointer supplied
  122. // by 'S3DCACHE->Load()' ensures that all nodes but the returned node (top node) are
  123. // children of at least one node, so all nodes are given unique names.
  124. // 3. if SG* trees are created independently of S3DCACHE->Load() the user must invoke
  125. // RenameNodes() as appropriate to ensure that all nodes have a unique name
  126. // 4. create an assembly structure by creating new IFSG_TRANSFORM nodes as appropriate
  127. // for each instance of a component; the component base model as returned by
  128. // S3DCACHE->Load() may be added to these IFSG_TRANSFORM nodes via 'AddRefNode()';
  129. // set the offset, rotation, etc of the IFSG_TRANSFORM node to ensure correct
  130. // 5. Ensure that all new IFSG_TRANSFORM nodes are placed as child nodes within a
  131. // top level IFSG_TRANSFORM node in preparation for final node naming and output
  132. // 6. Invoke RenameNodes() on the top level assembly node
  133. // 7. Invoke WriteVRML() as normal, with renameNodes = false, to write the entire assembly
  134. // structure to a single VRML file
  135. // 8. Clean up by deleting any extra IFSG_TRANSFORM wrappers and their underlying SG*
  136. // classes which have been created solely for the assembly output
  137. /**
  138. * 函数 ResetNodeIndex
  139. * 重置全局 SG* 类索引。
  140. *
  141. *@param 阳极可以是任何有效的 SGNODE。
  142. */
  143. /**
  144. * Function ResetNodeIndex
  145. * resets the global SG* class indices
  146. *
  147. * @param aNode may be any valid SGNODE
  148. */
  149. SGLIB_API void ResetNodeIndex( SGNODE* aNode );
  150. /**
  151. * 函数 RenameNodes
  152. * 根据当前重命名节点和所有子节点。
  153. * 全局 SG* 的值类别索引。
  154. *
  155. * @param 阳极是顶层节点。
  156. */
  157. /**
  158. * Function RenameNodes
  159. * renames a node and all children nodes based on the current
  160. * values of the global SG* class indices
  161. *
  162. * @param aNode is a top level node
  163. */
  164. SGLIB_API void RenameNodes( SGNODE* aNode );
  165. /**
  166. * 函数 DestroyNode。
  167. * 删除给定 SG* 类节点。此功能使其成为可能。
  168. * 安全删除 SG* 节点而不将节点与关联。
  169. * 其对应的 IFSG* 包装器。
  170. */
  171. /**
  172. * Function DestroyNode
  173. * deletes the given SG* class node. This function makes it possible
  174. * to safely delete an SG* node without associating the node with
  175. * its corresponding IFSG* wrapper.
  176. */
  177. SGLIB_API void DestroyNode( SGNODE* aNode );
  178. // 注意:以下函数便于创建和销毁。
  179. // 用于呈现的数据结构
  180. // NOTE: The following functions facilitate the creation and destruction
  181. // of data structures for rendering
  182. /**
  183. * 函数 GetModel
  184. * 创建阳极的 S3DMODEL 表示 (原始数据,无转换)。
  185. *
  186. * @param 阳极是要转录为 S3DMODEL 表示的节点。
  187. * @return 成功时返回阳极的 S3DMODEL 表示,否则为 NULL。
  188. */
  189. /**
  190. * Function GetModel
  191. * creates an S3DMODEL representation of aNode (raw data, no transforms)
  192. *
  193. * @param aNode is the node to be transcribed into an S3DMODEL representation
  194. * @return an S3DMODEL representation of aNode on success, otherwise NULL
  195. */
  196. SGLIB_API S3DMODEL* GetModel( SCENEGRAPH* aNode );
  197. /**
  198. * 函数 Destroy3DModel
  199. * 释放 S3DMODEL 结构使用的内存并将指针设置为。
  200. * 结构为 NULL。
  201. */
  202. /**
  203. * Function Destroy3DModel
  204. * frees memory used by an S3DMODEL structure and sets the pointer to
  205. * the structure to NULL
  206. */
  207. SGLIB_API void Destroy3DModel( S3DMODEL** aModel );
  208. /**
  209. * 函数 Free3DModel
  210. * 释放由 S3DMODEL 结构内部使用的内存。
  211. */
  212. /**
  213. * Function Free3DModel
  214. * frees memory used internally by an S3DMODEL structure
  215. */
  216. SGLIB_API void Free3DModel( S3DMODEL& aModel );
  217. /**
  218. * 函数 Free3DMesh
  219. * 释放 SMESH 结构内部使用的内存。
  220. */
  221. /**
  222. * Function Free3DMesh
  223. * frees memory used internally by an SMESH structure
  224. */
  225. SGLIB_API void Free3DMesh( SMESH& aMesh );
  226. /**
  227. * 函数 New3DModel
  228. * 创建并初始化 S3DMODEL 结构。
  229. */
  230. /**
  231. * Function New3DModel
  232. * creates and initializes an S3DMODEL struct
  233. */
  234. SGLIB_API S3DMODEL* New3DModel( void );
  235. /**
  236. * 函数 Init3DMaterial
  237. * 初始化 SMATERIAL 结构。
  238. */
  239. /**
  240. * Function Init3DMaterial
  241. * initializes an SMATERIAL struct
  242. */
  243. SGLIB_API void Init3DMaterial( SMATERIAL& aMat );
  244. /**
  245. * 函数 Init3DMesh
  246. * 创建并初始化 SMESH 结构。
  247. */
  248. /**
  249. * Function Init3DMesh
  250. * creates and initializes an SMESH struct
  251. */
  252. SGLIB_API void Init3DMesh( SMESH& aMesh );
  253. };

有关 Scenegraph API 的实际使用示例,请参阅上面的《advanced-3d-plugin(高级-3d-插件),Advanced 3D Plugin tutorial(高级 3D 插件教程)》,以及 KiCad VRML1,VRML2 和 X3D 解析器。