This directory will contain headers for the various types of
KiCad dynamic plugins and associated APIs.

In a typical implementation a dynamic plugin will provide a simple interface to
provide KiCad with a list of functions which can be invoked to provide the
desired feature. For example the 3D plugins provide a function to list the
file types supported by the plugin, the associated filters required for browsing
files, and a Load() function to process a 3D file and return a data structure
which KiCad can use in the 3D rendering process. The set of functions provided
by a plugin shall be referred to here as the Plugin Interface. Every plugin
must be a derived class of at least one type of plugin declared in the header
files in this directory. All implementations of a plugin interface constitute
an actual plugin; the various KiCad tools such as pcbnew and eeschema contain
no actual implementation of the plugin interface.

Plugins also need to interact with KiCad and its internal data while knowing
essentially nothing of the complex structures within KiCad. To make this possible
each type of dynamic plugin must interact with at least one type of API which
provides functions to create, inspect, and manipulate the complex data structures
within KiCad. These APIs shall be declared in the api subdirectory and must be
implemented within each KiCad tool which services the related plugin type. For
example the 3D plugins must produce the intermediate scene graph data for use
by the 3D renderer; to accomplish this an API is required to provide each 3D
plugin with a method for creating the data structures required by pcbnew and
cvpcb. In the implementation detail the API may be implemented once in the common
static library of pcbnew or it can be implemented as a runtime shared library
which can then be linked to by pcbnew. cvpcb, or even eeschema.

Plugin specialization: To keep APIs and plugin interfaces as simple as possible
it is necessary for plugins to be specialized (have different types). While it
is possible to define only one plugin interface and one API for any and all
plugins to use, this would result in a very large API which is difficult to
maintain. Having specialized plugins and APIs ensures better maintainability
of the code; a specific plugin may implement multiple plugin interfaces or
interact with multiple APIs if it makes sense to do so. At least two plugin
interfaces have been identified for implementation at this point: the 3D
Plugin Interface and the PCBExport interface. The 3D Plugin Interface shall
provide a method for processing supported 3D model types and returning an
intermediate scene graph representation which a renderer can use to create a
visual representation of the model. The PCBExport interface shall provide a
means of exporting PCB data to a variety of formats such as Specctra DSN for
the consumption of autorouters, GenCAD, VRML for visualization of the board
using external tools, and IDF and IGES for interacting with mechanical designers
and MCAD software. Other exporters such as netlist exporters or even BoM
exporters should be possible. A PCBImport Interface is also a possibility but
is currently a low priority item since there are currently only two import
functions implemented (Specctra result import and DXF import) and a significant
amount of work is required to implement the PCBImport API.

Plugin management: Since plugins are specialized, each type should also be
loaded and managed by a specialized plugin manager which has responsibilities
for ensuring integration of the plugin with KiCad.  For example the
3d_plugin_manager searches a list of paths to identify and load plugins which
implement the 3D Plugin Interface. The 3D manager extracts information from
each 3D plugin such as the types of 3D formats supported and the associated
file extensions; the manager also responds to a Load() request by activating
the appropriate 3D plugin and executing that plugin's Load() function. In the
case of the Export Plugin Interface, a specific exporter would enumerate the
plugins, add a menu item to the File->Export list, load and invoke a plugin's
Export() function at the user's request, and unload the plugin when the
Export() function completes.
