kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #27109
Re: Current state of ActionPlugin
Hi,
Yes it is based against HEAD on master. But between the hour I produce
it and the hour you test it there was some modifications on
scripting/kicadplugins.i ...
Please find attached the updated patch.
Tell me if you get an other error but on my side this patch look to work
on a fresh "git clone" directory.
Le 09/01/2017 à 23:33, Nick Østergaard a écrit :
> I am unable to apply this patch, are you sure this is made against
> HEAD on master?
>
> 2017-01-09 19:08 GMT+01:00 Jean-Samuel Reynaud <js.reynaud@xxxxxxxxx>:
>> Hi,
>>
>> Please find attached a patch with an implementation of this feature.
>>
>> I modified mainly the file pcbnew/menubar_pcbframe.cpp to add this menu
>> and some swig interface to implement python basics.
>>
>> I added
>> pcbnew/class_action_plugin.*
>> pcbnew/swig/pcbnew_action_plugins.*
>> to implement the feature
>>
>> I added
>> pcbnew/python/plugins/text_by_date.py
>> to share an example of how to use it.
>> This sample example (with comments...) just change any text field on
>> the current board where the content is "$date$" to "$date$" + date in
>> iso format:
>> example "$date$ 2017-01-09"
>>
>>
>>
>> Regards,
>> Le 04/01/2017 à 22:14, Wayne Stambaugh a écrit :
>>> To my knowledge no one is currently working on that.
>>>
>>> On 1/4/2017 4:16 PM, Jean-Samuel Reynaud wrote:
>>>> Mainly Action plugins was supposed to add right click/menu/toolbar hooks.
>>>>
>>>> There is two reference of this:
>>>> scripting/kicadplugins.i
>>>> and
>>>> pcbnew/swig/TODO.txt
>>>>
>>>>
>>>>
>>>> Le 04/01/2017 à 20:14, Wayne Stambaugh a écrit :
>>>>> What do you mean by action plugin? I'm working on the schematic I/O
>>>>> plugin. AFAIK, that is the only plugin in progress.
>>>>>
>>>>> On 1/3/2017 10:02 AM, Jean-Samuel Reynaud wrote:
>>>>>> Dear All,
>>>>>>
>>>>>> Quick question about ActionPlugin. What is the current state ? Is there
>>>>>> anybody working on it ?
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> _______________________________________________
>>>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>>> More help : https://help.launchpad.net/ListHelp
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>> More help : https://help.launchpad.net/ListHelp
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>> More help : https://help.launchpad.net/ListHelp
>>>>
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~kicad-developers
>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>> More help : https://help.launchpad.net/ListHelp
>>>
>>
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~kicad-developers
>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~kicad-developers
>> More help : https://help.launchpad.net/ListHelp
>>
diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h
index 2968614..1b7ead4 100644
--- a/include/wxPcbStruct.h
+++ b/include/wxPcbStruct.h
@@ -117,6 +117,14 @@ protected:
*/
void enableGALSpecificMenus();
+ /**
+ * a function to fill the action plugin menu
+ */
+#if defined(KICAD_SCRIPTING_WXPYTHON)
+ void createActionPluginMenus();
+ void OnActionPlugin( wxCommandEvent& aEvent);
+#endif
+
// Has meaning only if DKICAD_SCRIPTING_WXPYTHON option is on
/**
diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index 040f8e9..252c793 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -274,6 +274,7 @@ set( PCBNEW_CLASS_SRCS
zones_polygons_test_connections.cpp
zones_test_and_combine_areas.cpp
class_footprint_wizard.cpp
+ class_action_plugin.cpp
tools/selection_tool.cpp
tools/selection_area.cpp
@@ -319,6 +320,7 @@ set( PCBNEW_SCRIPTING_PYTHON_HELPERS
swig/python_scripting.cpp
swig/pcbnew_scripting_helpers.cpp
swig/pcbnew_footprint_wizards.cpp
+ swig/pcbnew_action_plugins.cpp
)
if( KICAD_SCRIPTING )
diff --git a/pcbnew/class_action_plugin.cpp b/pcbnew/class_action_plugin.cpp
new file mode 100644
index 0000000..9f11392
--- /dev/null
+++ b/pcbnew/class_action_plugin.cpp
@@ -0,0 +1,119 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+/**
+ * @file class_action_plugin.cpp
+ * @brief Class ACTION_PLUGIN and ACTION_PLUGINS
+ */
+
+#include "class_action_plugin.h"
+
+
+ACTION_PLUGIN::~ACTION_PLUGIN()
+{
+}
+
+
+void ACTION_PLUGIN::register_action()
+{
+ ACTION_PLUGINS::register_action( this );
+}
+
+
+std::vector<ACTION_PLUGIN*> ACTION_PLUGINS::m_Actions;
+std::vector<int> ACTION_PLUGINS::m_ActionsMenu;
+
+ACTION_PLUGIN* ACTION_PLUGINS::GetAction( int aIndex )
+{
+ return m_Actions[aIndex];
+}
+
+ACTION_PLUGIN* ACTION_PLUGINS::GetActionByMenu( int menu )
+{
+ int max = GetActionsCount();
+
+ for( int i = 0; i<max; i++ )
+ {
+ if( m_ActionsMenu[i] == menu )
+ return m_Actions[i];
+ }
+ return NULL;
+}
+
+void ACTION_PLUGINS::SetActionMenu( int aIndex, int idMenu )
+{
+ m_ActionsMenu[aIndex] = idMenu;
+}
+
+
+
+ACTION_PLUGIN* ACTION_PLUGINS::GetAction( wxString aName )
+{
+ int max = GetActionsCount();
+
+ for( int i = 0; i<max; i++ )
+ {
+ ACTION_PLUGIN* action = GetAction( i );
+
+ wxString name = action->GetName();
+
+ if( name.Cmp( aName )==0 )
+ return action;
+ }
+
+ return NULL;
+}
+
+
+int ACTION_PLUGINS::GetActionsCount()
+{
+ return m_Actions.size();
+}
+
+
+void ACTION_PLUGINS::register_action( ACTION_PLUGIN* aAction )
+{
+ m_Actions.push_back( aAction );
+ m_ActionsMenu.push_back( 0 );
+}
+
+
+bool ACTION_PLUGINS::deregister_object( void* aObject )
+{
+ int max = GetActionsCount();
+
+ for( int i = 0; i<max; i++ )
+ {
+ ACTION_PLUGIN* action = GetAction( i );
+
+ if( action->GetObject() == aObject )
+ {
+ m_Actions.erase( m_Actions.begin() + i );
+ delete action;
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/pcbnew/class_action_plugin.h b/pcbnew/class_action_plugin.h
new file mode 100644
index 0000000..9ebe5fa
--- /dev/null
+++ b/pcbnew/class_action_plugin.h
@@ -0,0 +1,158 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+/**
+ * @file class_action_plugin.h
+ * @brief Class PCBNEW_ACTION_PLUGINS
+ */
+
+#ifndef CLASS_ACTION_PLUGIN_H
+#define CLASS_ACTION_PLUGIN_H
+#include <vector>
+#include <wxPcbStruct.h>
+
+/**
+ * Class ACTION_PLUGIN
+ * This is the parent class from where any action plugin class must
+ * derive */
+class ACTION_PLUGIN
+{
+public:
+ ACTION_PLUGIN() {}
+ virtual ~ACTION_PLUGIN();
+
+ /**
+ * Function GetCategoryName
+ * @return the category name of the action (to be able to group action under the same submenu)
+ */
+ virtual wxString GetCategoryName() = 0;
+ /**
+ * Function GetName
+ * @return the name of the action
+ */
+
+ virtual wxString GetName() = 0;
+
+ /**
+ * Function GetDescription
+ * @return a description of the action plugin
+ */
+ virtual wxString GetDescription() = 0;
+
+ /**
+ * Function GetObject
+ * This method gets the pointer to the object from where this action constructs
+ * @return it's a void pointer, as it could be a PyObject or any other
+ */
+ virtual void* GetObject() = 0;
+
+
+ /**
+ * Function Run
+ * This method the the action
+ */
+ virtual void Run() = 0;
+
+ /**
+ * Function register_action
+ * It's the standard method of a "ACTION_PLUGIN" to register itself into
+ * the ACTION_PLUGINS singleton manager
+ */
+ void register_action();
+};
+
+
+class ACTION_PLUGINS
+{
+private:
+ /**
+ * ACTION_PLUGIN system wide static list
+ */
+ static std::vector<ACTION_PLUGIN*> m_Actions;
+ /**
+ * system wide static association between Plugin and menu id
+ */
+ static std::vector<int> m_ActionsMenu;
+
+public:
+
+ /**
+ * Function register_action
+ * An action calls this static method when it wants to register itself
+ * into the system actions
+ *
+ * @param aAction is the action plugin to be registered
+ */
+ static void register_action( ACTION_PLUGIN* aAction );
+
+ /**
+ * Function deregister_object
+ * Anyone calls this method to deregister an object which builds a action,
+ * it will lookup on the vector calling GetObject until find, then removed
+ * and deleted
+ *
+ * @param aObject is the action plugin object to be deregistered
+ */
+ static bool deregister_object( void* aObject );
+
+ /**
+ * Function GetAction
+ * @param aName is the action plugin name
+ * @return a action object by it's name or NULL if it isn't available.
+ */
+ static ACTION_PLUGIN* GetAction( wxString aName );
+
+ /**
+ * Function SetActionMenu
+ * Associate a menu id to an action plugin
+ * @param aInded is the action index
+ * @param idMenu is the associated menuitem id
+ */
+ static void SetActionMenu( int aIndex, int idMenu );
+
+
+ /**
+ * Function GetActionByMenu
+ * find action plugin associated to a menu id
+ * @param menu is the menu id (defined with SetActionMenu)
+ * @return the associated ACTION_PLUGIN (or null if not found)
+ */
+ static ACTION_PLUGIN* GetActionByMenu( int menu );
+
+
+ /**
+ * Function GetAction
+ * @return a action object by it's number or NULL if it isn't available.
+ * @param aIndex is the action index in list
+ */
+ static ACTION_PLUGIN* GetAction( int aIndex );
+
+ /**
+ * Function GetActionsCount
+ * @return the number of actions available into the system
+ */
+ static int GetActionsCount();
+};
+
+#endif /* PCBNEW_ACTION_PLUGINS_H */
diff --git a/pcbnew/menubar_pcbframe.cpp b/pcbnew/menubar_pcbframe.cpp
index 4ae3ba6..c6ab541 100644
--- a/pcbnew/menubar_pcbframe.cpp
+++ b/pcbnew/menubar_pcbframe.cpp
@@ -637,6 +637,14 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
_( "&Scripting Console" ),
_( "Show/Hide the Python scripting console" ),
KiBitmap( py_script_xpm ) );
+
+ wxMenu* submenuactionplugins = new wxMenu();
+
+ AddMenuItem( toolsMenu, submenuactionplugins, ID_TOOLBARH_PCB_ACTION_PLUGIN ,
+ _( "&External plugins" ),
+ _( "Give access to python action plugin" ),
+ KiBitmap( hammer_xpm ) );
+
#endif
wxMenu* designRulesMenu = new wxMenu;
diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp
index 819a9e8..a8bff04 100644
--- a/pcbnew/pcbframe.cpp
+++ b/pcbnew/pcbframe.cpp
@@ -472,6 +472,10 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
enableGALSpecificMenus();
+#if defined(KICAD_SCRIPTING_WXPYTHON)
+ createActionPluginMenus();
+#endif
+
// disable Export STEP item if kicad2step does not exist
wxString strK2S = Pgm().GetExecutablePath();
#ifdef __WXMAC__
diff --git a/pcbnew/pcbnew_id.h b/pcbnew/pcbnew_id.h
index 19614c0..a66081b 100644
--- a/pcbnew/pcbnew_id.h
+++ b/pcbnew/pcbnew_id.h
@@ -279,6 +279,7 @@ enum pcbnew_ids
ID_TOOLBARH_PCB_MODE_TRACKS,
ID_TOOLBARH_PCB_FREEROUTE_ACCESS,
ID_TOOLBARH_PCB_SCRIPTING_CONSOLE,
+ ID_TOOLBARH_PCB_ACTION_PLUGIN,
ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR,
diff --git a/pcbnew/python/plugins/text_by_date.py b/pcbnew/python/plugins/text_by_date.py
new file mode 100644
index 0000000..91d9048
--- /dev/null
+++ b/pcbnew/python/plugins/text_by_date.py
@@ -0,0 +1,61 @@
+# text_by_date.py
+#
+# Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+#
+
+
+import pcbnew
+import re
+import datetime
+
+
+
+
+class text_by_date(pcbnew.ActionPlugin):
+ """
+ test_by_date: A sample plugin as an example of ActionPlugin
+ Add the date to any text field of the board where the content is '$date$'
+ How to use:
+ - Add a text on your board with the content '$date$'
+ - Call the plugin
+ - Automaticaly the date will be added to the text (format YYYY-MM-DD)
+ """
+ def defaults(self):
+ """
+ Method defaults must be redefined
+ self.name should be the menu label to use
+ self.category should be the category (not yet used)
+ self.description should be a comprehensive description
+ of the plugin
+ """
+ self.name = "Add date on PCB"
+ self.category = "Modify PCB"
+ self.description = "Automaticaly add date on an existing PCB"
+
+ def Run(self):
+ pcb = pcbnew.GetBoard()
+ for draw in pcb.m_Drawings:
+ if draw.GetClass() == 'PTEXT':
+ txt = re.sub("\$date\$ [0-9]{4}-[0-9]{2}-[0-9]{2}",
+ draw.GetText(),"$date$")
+ if txt == "$date$":
+ draw.SetText("$date$ %s"%datetime.date.today())
+
+
+text_by_date().register()
diff --git a/pcbnew/swig/pcbnew_action_plugins.cpp b/pcbnew/swig/pcbnew_action_plugins.cpp
new file mode 100644
index 0000000..fbebb45
--- /dev/null
+++ b/pcbnew/swig/pcbnew_action_plugins.cpp
@@ -0,0 +1,224 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file pcbnew_action_plugins.cpp
+ * @brief Class PCBNEW_PYTHON_ACTION_PLUGINS
+ */
+
+#include "pcbnew_action_plugins.h"
+#include <python_scripting.h>
+#include <stdio.h>
+#include <macros.h>
+#include <pcbnew_id.h>
+#include <menus_helpers.h>
+#include <class_drawpanel.h> // m_canvas
+#include <class_board.h>
+#include <class_module.h>
+#include <class_track.h>
+#include <board_commit.h>
+#include <kicad_device_context.h>
+
+PYTHON_ACTION_PLUGIN::PYTHON_ACTION_PLUGIN( PyObject* aAction )
+{
+ PyLOCK lock;
+
+ this->m_PyAction = aAction;
+ Py_XINCREF( aAction );
+}
+
+
+PYTHON_ACTION_PLUGIN::~PYTHON_ACTION_PLUGIN()
+{
+ PyLOCK lock;
+
+ Py_XDECREF( this->m_PyAction );
+}
+
+
+PyObject* PYTHON_ACTION_PLUGIN::CallMethod( const char* aMethod, PyObject* aArglist )
+{
+ PyLOCK lock;
+
+ PyErr_Clear();
+ // pFunc is a new reference to the desired method
+ PyObject* pFunc = PyObject_GetAttrString( this->m_PyAction, aMethod );
+
+ if( pFunc && PyCallable_Check( pFunc ) )
+ {
+ PyObject* result = PyObject_CallObject( pFunc, aArglist );
+
+ if( PyErr_Occurred() )
+ {
+ wxMessageBox( PyErrStringWithTraceback(),
+ wxT( "Exception on python action plugin code" ),
+ wxICON_ERROR | wxOK );
+ }
+
+ if( result )
+ {
+ Py_XDECREF( pFunc );
+ return result;
+ }
+ }
+ else
+ {
+ printf( "method not found, or not callable: %s\n", aMethod );
+ }
+
+ if( pFunc )
+ {
+ Py_XDECREF( pFunc );
+ }
+
+ return NULL;
+}
+
+
+wxString PYTHON_ACTION_PLUGIN::CallRetStrMethod( const char* aMethod, PyObject* aArglist )
+{
+ wxString ret;
+ PyLOCK lock;
+
+ PyObject* result = CallMethod( aMethod, aArglist );
+
+ if( result )
+ {
+ const char* str_res = PyString_AsString( result );
+ ret = FROM_UTF8( str_res );
+ Py_DECREF( result );
+ }
+
+ return ret;
+}
+
+
+
+wxString PYTHON_ACTION_PLUGIN::GetCategoryName()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetCategoryName" );
+}
+
+wxString PYTHON_ACTION_PLUGIN::GetName()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetName" );
+}
+
+
+wxString PYTHON_ACTION_PLUGIN::GetDescription()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetDescription" );
+}
+
+void PYTHON_ACTION_PLUGIN::Run()
+{
+ PyLOCK lock;
+ CallRetStrMethod( "Run" );
+}
+
+
+
+void* PYTHON_ACTION_PLUGIN::GetObject()
+{
+ return (void*) m_PyAction;
+}
+
+
+
+
+void PYTHON_ACTION_PLUGINS::register_action( PyObject* aPyAction )
+{
+ PYTHON_ACTION_PLUGIN* fw = new PYTHON_ACTION_PLUGIN( aPyAction );
+
+ fw->register_action();
+}
+
+
+void PYTHON_ACTION_PLUGINS::deregister_action( PyObject* aPyAction )
+{
+ // deregister also destroyes the previously created "PYTHON_ACTION_PLUGIN object"
+ ACTION_PLUGINS::deregister_object( (void*) aPyAction );
+}
+
+#if defined(KICAD_SCRIPTING_WXPYTHON)
+
+/**
+ * Function OnActionPlugin
+ * Launched by the menu when an action is called
+ */
+void PCB_EDIT_FRAME::OnActionPlugin( wxCommandEvent& event )
+{
+ int id = event.GetId();
+
+ ACTION_PLUGIN *actionPlugin = ACTION_PLUGINS::GetActionByMenu( id );
+ if( actionPlugin )
+ {
+ // FIXME: Adding recovery point for jobs
+ // BOARD_COMMIT commit( this );
+ // commit.Push( _( "External plugin" ) );
+
+ actionPlugin->Run();
+
+ OnModify();
+
+ if( IsGalCanvasActive() )
+ {
+ UseGalCanvas( GetGalCanvas() );
+ }
+ else
+ {
+ GetScreen()->SetModify();
+ Refresh();
+ }
+ }
+
+
+}
+
+
+/**
+ * Function createActionPluginMenus
+ * Fill action menu with all registred action plugins
+ */
+void PCB_EDIT_FRAME::createActionPluginMenus()
+{
+ wxMenu *actionMenu = GetMenuBar()->FindItem(ID_TOOLBARH_PCB_ACTION_PLUGIN)->GetSubMenu();
+
+ for( int i = 0; i < ACTION_PLUGINS::GetActionsCount();i++ ) {
+ wxMenuItem *item = AddMenuItem( actionMenu, wxID_ANY,
+ ACTION_PLUGINS::GetAction(i)->GetName(),
+ ACTION_PLUGINS::GetAction(i)->GetDescription(),
+ KiBitmap( hammer_xpm ) );
+ ACTION_PLUGINS::SetActionMenu( i, item->GetId() );
+ Connect( item->GetId(), wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &PCB_EDIT_FRAME::OnActionPlugin );
+ }
+}
+
+#endif
diff --git a/pcbnew/swig/pcbnew_action_plugins.h b/pcbnew/swig/pcbnew_action_plugins.h
new file mode 100644
index 0000000..6e4f0e4
--- /dev/null
+++ b/pcbnew/swig/pcbnew_action_plugins.h
@@ -0,0 +1,62 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file pcbnew_action_plugins.h
+ * @brief Class PCBNEW_ACTION_PLUGINS
+ */
+
+#ifndef PCBNEW_ACTION_PLUGINS_H
+#define PCBNEW_ACTION_PLUGINS_H
+#include <Python.h>
+#include <vector>
+#include <class_action_plugin.h>
+
+
+class PYTHON_ACTION_PLUGIN : public ACTION_PLUGIN
+{
+ PyObject* m_PyAction;
+ PyObject* CallMethod( const char* aMethod,
+ PyObject* aArglist = NULL );
+ wxString CallRetStrMethod( const char* aMethod,
+ PyObject* aArglist = NULL );
+
+public:
+ PYTHON_ACTION_PLUGIN( PyObject* action );
+ ~PYTHON_ACTION_PLUGIN();
+ wxString GetCategoryName() override;
+ wxString GetName() override;
+ wxString GetDescription() override;
+ void Run() override;
+ void* GetObject() override;
+};
+
+
+class PYTHON_ACTION_PLUGINS
+{
+public:
+ static void register_action( PyObject* aPyAction );
+ static void deregister_action( PyObject* aPyAction );
+};
+
+#endif /* PCBNEW_ACTION_PLUGINS_H */
diff --git a/pcbnew/swig/plugins.i b/pcbnew/swig/plugins.i
index cff768b..db41efb 100644
--- a/pcbnew/swig/plugins.i
+++ b/pcbnew/swig/plugins.i
@@ -24,6 +24,7 @@
%{
#include <pcbnew_footprint_wizards.h>
+#include <pcbnew_action_plugins.h>
%}
class PYTHON_FOOTPRINT_WIZARDS
@@ -33,3 +34,11 @@ public:
static void deregister_wizard( PyObject* wizard );
};
+
+class PYTHON_ACTION_PLUGINS
+{
+public:
+ static void register_action(PyObject *wizard);
+ static void deregister_action(PyObject *wizard);
+
+};
diff --git a/scripting/kicadplugins.i b/scripting/kicadplugins.i
index 57a3405..b2bd08d 100644
--- a/scripting/kicadplugins.i
+++ b/scripting/kicadplugins.i
@@ -208,7 +208,8 @@ class KiCadPlugin:
return
if isinstance(self,ActionPlugin):
- pass # register to action plugins in C++
+ PYTHON_ACTION_PLUGINS.register_action(self)
+ return
return
@@ -221,7 +222,8 @@ class KiCadPlugin:
return
if isinstance(self,ActionPlugin):
- pass # deregister to action plugins in C++
+ PYTHON_ACTION_PLUGINS.deregister_action(self)
+ return
return
@@ -563,5 +565,23 @@ class FootprintWizardPlugin(KiCadPlugin, object):
class ActionPlugin(KiCadPlugin):
def __init__(self):
KiCadPlugin.__init__(self)
+ self.defaults()
+
+ def defaults(self):
+ self.name = "Undefined Action plugin"
+ self.category = "Undefined"
+ self.description = ""
+
+ def GetName(self):
+ return self.name
+
+ def GetCategoryName(self):
+ return self.category
+
+ def GetDescription(self):
+ return self.description
+
+ def Run(self):
+ return
}
Follow ups
References