kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #07980
Re: KICAD_PLUGIN for libraries/components (pcbnew)
Here it's the updated IO_MGR patch, some emails got lost in the middle,
I was unintentionally writing to Dick only, I wonder if there is some kind
of "always Reply all"
in gmail.
The main change is the Serialize / Unserialize for clipboard. :)
2012/4/13 Dick Hollenbeck <dick@xxxxxxxxxxx>
> On 04/13/2012 09:00 AM, Miguel Angel Ajo Pelayo wrote:
> > Hi Dick thanks for the reply :-)
> >
> > 2012/4/13 Dick Hollenbeck <dick@xxxxxxxxxxx>
> >> 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?
>
> I already answered this question, no. There is no point to saving a
> single footprint in a
> obsolete format.
>
>
> >
> >>> 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 :-)
>
> If the UI presents a method to search for keyword, do we want the plugin
> doing the
> searching or the client code?
>
> I say client code, for now. This is different than in SWEET, where will
> immediately have
> remote libraries. We are not striving for that here and now in PCBNEW.
>
> Searching then requires that every module be loaded and searched in client
> code. This
> keeps the plugin simpler, and puts searching code in one place, higher up.
>
>
> >
> >
> >>> + 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?
>
> I already answered your question. I like the original function prototype
> for now.
>
>
>
>
>
--
Miguel Angel Ajo Pelayo
http://www.nbee.es
+34 636 52 25 69
skype: ajoajoajo
Attachment:
io_mgr.patch
Description: Binary data
References
-
KICAD_PLUGIN for libraries/components (pcbnew)
From: Miguel Angel Ajo Pelayo, 2012-04-07
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Dick Hollenbeck, 2012-04-11
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Dick Hollenbeck, 2012-04-11
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Miguel Angel Ajo Pelayo, 2012-04-12
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Dick Hollenbeck, 2012-04-12
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Miguel Angel Ajo Pelayo, 2012-04-12
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Miguel Angel Ajo Pelayo, 2012-04-13
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Dick Hollenbeck, 2012-04-13
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Miguel Angel Ajo Pelayo, 2012-04-13
-
Re: KICAD_PLUGIN for libraries/components (pcbnew)
From: Dick Hollenbeck, 2012-04-13