Hi Dick thanks for the reply :-)

2012/4/13 Dick Hollenbeck <d...@softplc.com>
>
> Hi Mike,
>
> Thanks for your time on this.


I'm happy to do it.

>[snip]

> >
> > 1)  Added to new plugin types:
>
> I don' think we don't need these 2 new enum values.  This support goes into 
> LEGACY and
> KICAD plugins, respectively.  The idea is to bind the library technology with 
> its
> corresponding board technology, in the collection of API functions.  This way 
> a developer
> with knowledge on one kind of foreign file format set, can do a single plugin 
> and get
> everything in there.
>

In that case, we will need to return a list of supported file
extensions for every plugin,
or do a

- static const wxString GetFileExtension( PCB_FILE_T aFileType );
+ static const wxArrayString GetFileExtensions( PCB_FILE_T aFileType );

or just:

+ static const wxString GetLibraryFileExtension( PCB_FILE_T aFileType );


 In the case of the legacy plugin we will have several file extensions
if we support
pcb (.brd) libraries (.dontremembernow) and components (.cmp)

> > [snip]
>
>
> The implementor of the plugin can indeed implement a subset of all the PLUGIN 
> API
> functions.  Non-implemented ones return an error code.  The developer using 
> the plugin
> will know this in advance for the time being, since he can see the source 
> code, and not
> jump off a cliff not knowing his parachute package has no fabric in it.
>
> The PLUGIN api is a way or organizing functionality, is not a way of 
> providing surprises.
>

Well, I was thinking about future dinamically loadable plugins
(.so/dll) or (.py) which anybody could install dinamically in the
software as a plugin. This is why I thought this way.


> >     c)  There is the case of opening/saving single componente files 
> > (.cmp?), that would
> > be almost the same plugin.
>
> I don't want to support that, unless it can be done with the plugin with 
> special status,
> which is the "KICAD" plugin, and I think this is simply
>
> SaveModule() on the KICAD plugin.  It comes out in s-expression format, 
> ALWAYS.  And
> because the "library" argument is actually only a directory for that plugin, 
> you have your
> CMP file, but it is always s-expresion.

Yes, but for LEGACY plugin we might need it. Don't we?


> >
> > Future ideas (that I might want to add for py-scripting) -out of scope 
> > right now-:
> >      e)  Dynamic plugin registration, then a python PLUGIN could get itself 
> > registered
> > on IO_MGR to read/write formats: that would lead to faster format 
> > importer/exporters
> > development.
>
>
> Supporting a python plugin does not mandate dynamic C++ registration, if the 
> python plugin
> is known ahead of time.  However, it is not clear to me that keeping an "in 
> process"
> plugin in python is sensible.  The purpose of a plugin is to continually 
> access a file of
> a particular format category, over and over, without actually committing to 
> converting it
> over.

Well think of 3 different plugins installed together (and not compiled
in). They may need it's own id. But we will see this on the future,
doesn't make sense at this moment.

>
> If you want to write a file *converter*, and want to do it in python, it does 
> not have to
> be a PLUGIN.  But if you want to seemlessly read and write EAGLE files, 
> everyday of the
> week from KiCad, C++ is the better choice for that plugin.

Yes, but Imagine one day somebody writes for us a plugin that reads
and writes Ascii P-CAD, ascii protel, and he did because he could do
it without recompiling the whole kicad (which is not hard when you get
used to it, but it's a high barrier for most people)
>  [snip]

> > io_mgr_lib.patch
> >
> >
> > === modified file 'pcbnew/io_mgr.h'
> > --- pcbnew/io_mgr.h   2012-04-07 18:05:56 +0000

> > +
> > +    /**
> > +     * Function ListModules
> > +     * finds the requested PLUGIN and if found, calls the 
> > PLUGIN->ListModules(..)
> > +     * function on it using the arguments passed to this function.
> > +     * After the PLUGIN->ListModules() function returns, the PLUGIN
> > +     * is Released() as part of this call.
> > +     *
> > +     * @param aFileType is the PCB_FILE_T of file to load.
> > +     *
> > +     * @param aLibraryPath is the path to the library file or directory.
> > +     *
> > +     * @param aProperties is an associative array that can be used to tell 
> > the
> > +     *  plugin how to access the library file.
> > +     *  The caller continues to own this object (plugin may not delete 
> > it), and
> > +     *  plugins should expect it to be optionally NULL.
>
> I suppose we have to decide how and where we are going to support "searching".
>
> The aProperties argument may be one possibility, or we can do this higher up, 
> in the C++
> MODULE realm.
>
> The latter keeps the plugin simpler.  Leaving it out of searching, but 
> requires that every
> module be instantiated to do a rigorous search.
>
> Check client library code and let me know what you think.
>

What do you mean exactly for searching? , searching for parts in a
library with a wildcard?, I don't understand the relationship with
instantiating a module.  hmmm :-)



> > +    static MODULE* LoadModule( PCB_FILE_T aFileType,
> > +                                const wxString& aLibraryPath,
> > +                                wxString& aModuleName,
>
> I don't understand why you kept this argument, aAppendToBoard:
>

Well, just to be symmetrical to Load, and get your module "added" to a
board as you open it.

May be Load has it because you cannot do BOARD.Add(board) , right?

> > +                                BOARD* aAppendToBoard = NULL,
> > +                                PROPERTIES* aProperties = NULL);
> > +
> > +    /**
> > +     * Function SaveModule
> > +     * will write a module to an existing library, or just create the 
> > library
> > +     * if it doesn't exist
> > +     *
> > +     * @param aFileType is the PCB_FILE_T of file to save.
> > +     *
> > +     * @param aLibraryPath is the path of the library where we want the 
> > module
> > +     *  to be stored in.
> > +     *
> > +     * @param aModule is the module object that we want to store in the 
> > library.
> > +     *   The caller continues to own the MODULE.
> > +     *
> > +     * @param aProperties is an associative array that can be used to tell 
> > the
> > +     *  saver how to save the file, because it can take any number of
> > +     *  additional named tuning arguments that the plugin is known to 
> > support.
> > +     *  The caller continues to own this object (plugin may not delete 
> > it), and
> > +     *  plugins should expect it to be optionally NULL.
> > +     *
> > +     * @throw IO_ERROR if there is a problem saving or exporting.
> > +     */
> > +     static void SaveModule( PCB_FILE_T aFileType, const wxString& 
> > aLibraryPath,
> > +                              MODULE* aModule, PROPERTIES* aProperties = 
> > NULL);
> >  };
> >
> >
> > @@ -237,6 +325,81 @@
> >      virtual void Save( const wxString& aFileName, BOARD* aBoard,
> >                         PROPERTIES* aProperties = NULL );
>
>
> The last 3 functions should be virtual not static if they are to go into the 
> PLUGIN interface:

Totally right :-)

I compiled doxygen but didn't try to make it compile the code yet, I
wanted to discuss first about implementation.


> Here we get the footprint name from the MODULE?  Seems probably good enough, 
> but slight
> chance it will not be.
>
> > +     static void SaveModule( const wxString& aLibraryPath,
> > +                              MODULE* aModule, PROPERTIES* aProperties = 
> > NULL);

Yes, it's omited for that reason, but could be in the parameters too.
In which case could we need to change the module name?



--

Miguel Angel Ajo Pelayo
http://www.nbee.es
+34 636 52 25 69
skype: ajoajoajo

_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to     : kicad-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kicad-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to