diff --git a/pcbnew/class_footprint_wizard.cpp b/pcbnew/class_footprint_wizard.cpp index f841b5fbbc..10461e4c79 100644 --- a/pcbnew/class_footprint_wizard.cpp +++ b/pcbnew/class_footprint_wizard.cpp @@ -31,48 +31,73 @@ #include "class_footprint_wizard.h" #include + +FOOTPRINT_WIZARD::~FOOTPRINT_WIZARD() +{ +} + + void FOOTPRINT_WIZARD::register_wizard() { FOOTPRINT_WIZARDS::register_wizard( this ); } -std::vector FOOTPRINT_WIZARDS::m_FootprintWizards; + +std::vector FOOTPRINT_WIZARDS::m_FootprintWizards; FOOTPRINT_WIZARD* FOOTPRINT_WIZARDS::GetWizard( int aIndex ) { return m_FootprintWizards[aIndex]; } + FOOTPRINT_WIZARD* FOOTPRINT_WIZARDS::GetWizard( wxString aName ) { int max = GetSize(); - for( int i=0; iGetName(); + wxString name = wizard->GetName(); - if ( name.Cmp( aName ) ) - return wizard; + if( name.Cmp( aName )==0 ) + return wizard; } return NULL; } + int FOOTPRINT_WIZARDS::GetSize() { return m_FootprintWizards.size(); } -void FOOTPRINT_WIZARDS::register_wizard(FOOTPRINT_WIZARD *aWizard) + +void FOOTPRINT_WIZARDS::register_wizard( FOOTPRINT_WIZARD* aWizard ) { - wxString name = aWizard->GetName(); - m_FootprintWizards.push_back( aWizard ); + m_FootprintWizards.push_back( aWizard ); } +bool FOOTPRINT_WIZARDS::deregister_object( void* aObject ) +{ + int max = GetSize(); + for( int i = 0; iGetObject() == aObject ) + { + m_FootprintWizards.erase( m_FootprintWizards.begin() + i ); + delete wizard; + return true; + } + } + + return false; +} diff --git a/pcbnew/class_footprint_wizard.h b/pcbnew/class_footprint_wizard.h index 5b4edd69dd..bfe9cb969d 100644 --- a/pcbnew/class_footprint_wizard.h +++ b/pcbnew/class_footprint_wizard.h @@ -29,7 +29,7 @@ */ #ifndef CLASS_FOOTPRINT_WIZARD_H -#define CLASS_FOOTPRINT_WIZARD_H +#define CLASS_FOOTPRINT_WIZARD_H #include #include @@ -39,48 +39,47 @@ * derive */ class FOOTPRINT_WIZARD { - public: FOOTPRINT_WIZARD() {} - ~FOOTPRINT_WIZARD() {} + virtual ~FOOTPRINT_WIZARD(); /** * Function GetName * @return the name of the wizard */ - virtual wxString GetName()=0; + virtual wxString GetName() = 0; /** * Function GetImage * @return an svg image of the wizard to be rendered */ - virtual wxString GetImage()=0; + virtual wxString GetImage() = 0; /** * Function GetDescription * @return a description of the footprint wizard */ - virtual wxString GetDescription()=0; + virtual wxString GetDescription() = 0; /** * Function GetNumParameterPages * @return the number of parameter pages that this wizard will show to the user */ - virtual int GetNumParameterPages()=0; + virtual int GetNumParameterPages() = 0; /** * Function GetParameterPageName * @param aPage is the page we want the name of * @return a string with the page name */ - virtual wxString GetParameterPageName(int aPage)=0; + virtual wxString GetParameterPageName( int aPage ) = 0; /** * Function GetParameterNames * @param aPage is the page we want the parameter names of * @return an array string with the parameter names on a certain page */ - virtual wxArrayString GetParameterNames(int aPage)=0; + virtual wxArrayString GetParameterNames( int aPage ) = 0; /** * Function GetParameterTypes @@ -88,7 +87,7 @@ public: * @return an array string with the parameter types on a certain page * "IU" for internal units, "UNITS" for units (0,1,2,3...,N) */ - virtual wxArrayString GetParameterTypes(int aPage)=0; + virtual wxArrayString GetParameterTypes( int aPage ) = 0; /** @@ -96,14 +95,14 @@ public: * @param aPage is the page we want the parameter values of * @return an array of parameter values */ - virtual wxArrayString GetParameterValues(int aPage)=0; + virtual wxArrayString GetParameterValues( int aPage ) = 0; /** * Function GetParameterErrors * @param aPage is the page we want to know the errors of * @return an array of errors (if any) for the parameters, empty strings for OK parameters */ - virtual wxArrayString GetParameterErrors(int aPage)=0; + virtual wxArrayString GetParameterErrors( int aPage ) = 0; /** * Function SetParameterValues @@ -111,14 +110,21 @@ public: * @param aValues are the values we want to set into the parameters * @return an array of parameter values */ - virtual wxString SetParameterValues(int aPage,wxArrayString& aValues)=0; + virtual wxString SetParameterValues( int aPage, wxArrayString& aValues ) = 0; /** * Function GetModule * This method builds the module itself and returns it to the caller function * @return PCB module built from the parameters given to the class */ - virtual MODULE *GetModule()=0; + virtual MODULE* GetModule() = 0; + + /** + * Function GetObject + * This method gets the pointer to the object from where this wizard constructs + * @return it's a void pointer, as it could be a PyObject or any other + */ + virtual void* GetObject() = 0; /** * Function register_wizard @@ -126,8 +132,7 @@ public: * the FOOTPRINT_WIZARDS singleton manager * */ - void register_wizard(); - + void register_wizard(); }; @@ -135,10 +140,9 @@ class FOOTPRINT_WIZARDS { private: /** - * FOOTPRINT_WIZARD system wide static list - */ - static std::vector m_FootprintWizards; - + * FOOTPRINT_WIZARD system wide static list + */ + static std::vector m_FootprintWizards; public: /** @@ -149,7 +153,18 @@ public: * @param aWizard is the footprint wizard to be registered * */ - static void register_wizard(FOOTPRINT_WIZARD *aWizard); + static void register_wizard( FOOTPRINT_WIZARD* aWizard ); + + /** + * Function deregister_object + * Anyone calls this method to deregister an object which builds a wizard, + * it will lookup on the vector calling GetObject until find, then removed + * and deleted + * + * @param aObject is the footprint wizard object to be deregistered + * + */ + static bool deregister_object( void* aObject ); /** * Function GetWizard @@ -157,7 +172,7 @@ public: * @return a wizard object by it's name or NULL if it isn't available. * */ - static FOOTPRINT_WIZARD* GetWizard(wxString aName); + static FOOTPRINT_WIZARD* GetWizard( wxString aName ); /** * Function GetWizard @@ -165,15 +180,13 @@ public: * @param aIndex is the wizard index in list * */ - static FOOTPRINT_WIZARD* GetWizard( int aIndex ); + static FOOTPRINT_WIZARD* GetWizard( int aIndex ); /** * Function GetSize * @return the number of wizards available into the system */ - static int GetSize(); - + static int GetSize(); }; -#endif /* PCBNEW_FOOTPRINT_WIZARDS_H */ - +#endif /* PCBNEW_FOOTPRINT_WIZARDS_H */ diff --git a/pcbnew/footprint_wizard.cpp b/pcbnew/footprint_wizard.cpp index db13e71066..75560423a0 100644 --- a/pcbnew/footprint_wizard.cpp +++ b/pcbnew/footprint_wizard.cpp @@ -94,13 +94,15 @@ void FOOTPRINT_WIZARD_FRAME::DisplayWizardInfos() void FOOTPRINT_WIZARD_FRAME::ReloadFootprint() { - if( m_FootprintWizard == NULL ) + FOOTPRINT_WIZARD* footprintWizard = GetMyWizard(); + + if( !footprintWizard ) return; SetCurItem( NULL ); // Delete the current footprint GetBoard()->m_Modules.DeleteAll(); - MODULE* m = m_FootprintWizard->GetModule(); + MODULE* m = footprintWizard->GetModule(); if( m ) { @@ -112,18 +114,37 @@ void FOOTPRINT_WIZARD_FRAME::ReloadFootprint() } else { - printf( "m_FootprintWizard->GetModule() returns NULL\n" ); + printf( "footprintWizard->GetModule() returns NULL\n" ); } m_canvas->Refresh(); } +FOOTPRINT_WIZARD* FOOTPRINT_WIZARD_FRAME::GetMyWizard() +{ + if( m_wizardName.Length()==0 ) + return NULL; + + FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARDS::GetWizard( m_wizardName ); + + if( !footprintWizard ) + { + wxMessageBox( _( "Couldn't reload footprint wizard" ) ); + return NULL; + } + + return footprintWizard; +} + + MODULE* FOOTPRINT_WIZARD_FRAME::GetBuiltFootprint() { - if( m_FootprintWizard ) + FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARDS::GetWizard( m_wizardName ); + + if( footprintWizard ) { - return m_FootprintWizard->GetModule(); + return footprintWizard->GetModule(); } else { @@ -139,12 +160,17 @@ void FOOTPRINT_WIZARD_FRAME::SelectFootprintWizard() selectWizard->ShowModal(); - m_FootprintWizard = selectWizard->GetWizard(); + FOOTPRINT_WIZARD* footprintWizard = selectWizard->GetWizard(); - if( m_FootprintWizard ) + if( footprintWizard ) { - m_wizardName = m_FootprintWizard->GetName(); - m_wizardDescription = m_FootprintWizard->GetDescription(); + m_wizardName = footprintWizard->GetName(); + m_wizardDescription = footprintWizard->GetDescription(); + } + else + { + m_wizardName = wxT( "" ); + m_wizardDescription = wxT( "" ); } ReloadFootprint(); @@ -169,12 +195,17 @@ void FOOTPRINT_WIZARD_FRAME::ParametersUpdated( wxGridEvent& event ) { int page = m_PageList->GetSelection(); + FOOTPRINT_WIZARD* footprintWizard = GetMyWizard(); + + if( !footprintWizard ) + return; + if( page<0 ) return; int n = m_ParameterGrid->GetNumberRows(); wxArrayString arr; - wxArrayString ptList = m_FootprintWizard->GetParameterTypes( page ); + wxArrayString ptList = footprintWizard->GetParameterTypes( page ); for( int i = 0; iSetParameterValues( page, arr ); + wxString res = footprintWizard->SetParameterValues( page, arr ); ReloadFootprint(); DisplayWizardInfos(); diff --git a/pcbnew/footprint_wizard_frame.cpp b/pcbnew/footprint_wizard_frame.cpp index b3d7e4afd0..f1266e434f 100644 --- a/pcbnew/footprint_wizard_frame.cpp +++ b/pcbnew/footprint_wizard_frame.cpp @@ -52,37 +52,39 @@ BEGIN_EVENT_TABLE( FOOTPRINT_WIZARD_FRAME, EDA_DRAW_FRAME ) - /* Window events */ - EVT_CLOSE( FOOTPRINT_WIZARD_FRAME::OnCloseWindow ) - EVT_SIZE( FOOTPRINT_WIZARD_FRAME::OnSize ) - EVT_ACTIVATE( FOOTPRINT_WIZARD_FRAME::OnActivate ) +/* Window events */ +EVT_CLOSE( FOOTPRINT_WIZARD_FRAME::OnCloseWindow ) +EVT_SIZE( FOOTPRINT_WIZARD_FRAME::OnSize ) +EVT_ACTIVATE( FOOTPRINT_WIZARD_FRAME::OnActivate ) - /* Sash drag events */ - EVT_SASH_DRAGGED( ID_FOOTPRINT_WIZARD_PAGES, FOOTPRINT_WIZARD_FRAME::OnSashDrag ) - EVT_SASH_DRAGGED( ID_FOOTPRINT_WIZARD_PARAMETERS, FOOTPRINT_WIZARD_FRAME::OnSashDrag ) +/* Sash drag events */ +EVT_SASH_DRAGGED( ID_FOOTPRINT_WIZARD_PAGES, FOOTPRINT_WIZARD_FRAME::OnSashDrag ) +EVT_SASH_DRAGGED( ID_FOOTPRINT_WIZARD_PARAMETERS, FOOTPRINT_WIZARD_FRAME::OnSashDrag ) - /* Toolbar events */ - EVT_TOOL( ID_FOOTPRINT_WIZARD_SELECT_WIZARD, - FOOTPRINT_WIZARD_FRAME::SelectCurrentWizard ) +/* Toolbar events */ +EVT_TOOL( ID_FOOTPRINT_WIZARD_SELECT_WIZARD, + FOOTPRINT_WIZARD_FRAME::SelectCurrentWizard ) - EVT_TOOL( ID_FOOTPRINT_WIZARD_NEXT, - FOOTPRINT_WIZARD_FRAME::Process_Special_Functions ) +EVT_TOOL( ID_FOOTPRINT_WIZARD_NEXT, + FOOTPRINT_WIZARD_FRAME::Process_Special_Functions ) - EVT_TOOL( ID_FOOTPRINT_WIZARD_PREVIOUS, - FOOTPRINT_WIZARD_FRAME::Process_Special_Functions ) +EVT_TOOL( ID_FOOTPRINT_WIZARD_PREVIOUS, + FOOTPRINT_WIZARD_FRAME::Process_Special_Functions ) - EVT_TOOL( ID_FOOTPRINT_WIZARD_DONE, - FOOTPRINT_WIZARD_FRAME::ExportSelectedFootprint ) +EVT_TOOL( ID_FOOTPRINT_WIZARD_DONE, + FOOTPRINT_WIZARD_FRAME::ExportSelectedFootprint ) - EVT_TOOL( ID_FOOTPRINT_WIZARD_SHOW_3D_VIEW, - FOOTPRINT_WIZARD_FRAME::Show3D_Frame ) +EVT_TOOL( ID_FOOTPRINT_WIZARD_SHOW_3D_VIEW, + FOOTPRINT_WIZARD_FRAME::Show3D_Frame ) - /* listbox events */ - EVT_LISTBOX( ID_FOOTPRINT_WIZARD_PAGE_LIST, FOOTPRINT_WIZARD_FRAME::ClickOnPageList ) - EVT_GRID_CMD_CELL_CHANGE( ID_FOOTPRINT_WIZARD_PARAMETER_LIST, - FOOTPRINT_WIZARD_FRAME::ParametersUpdated ) +/* listbox events */ +EVT_LISTBOX( ID_FOOTPRINT_WIZARD_PAGE_LIST, FOOTPRINT_WIZARD_FRAME::ClickOnPageList ) +EVT_GRID_CMD_CELL_CHANGE( ID_FOOTPRINT_WIZARD_PARAMETER_LIST, + FOOTPRINT_WIZARD_FRAME::ParametersUpdated ) +EVT_GRID_CMD_EDITOR_HIDDEN( ID_FOOTPRINT_WIZARD_PARAMETER_LIST, + FOOTPRINT_WIZARD_FRAME::ParametersUpdated ) - EVT_MENU( ID_SET_RELATIVE_OFFSET, FOOTPRINT_WIZARD_FRAME::OnSetRelativeOffset ) +EVT_MENU( ID_SET_RELATIVE_OFFSET, FOOTPRINT_WIZARD_FRAME::OnSetRelativeOffset ) END_EVENT_TABLE() @@ -131,7 +133,6 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( FOOTPRINT_EDIT_FRAME* parent, // SetIcon( icon ); m_HotkeysZoomAndGridList = g_Module_Viewer_Hokeys_Descr; - m_FootprintWizard = NULL; m_PageList = NULL; m_ParameterGrid = NULL; m_PageListWindow = NULL; @@ -386,15 +387,18 @@ void FOOTPRINT_WIZARD_FRAME::ReCreatePageList() if( m_PageList == NULL ) return; - if( m_FootprintWizard == NULL ) + FOOTPRINT_WIZARD* footprintWizard = GetMyWizard(); + + if( !footprintWizard ) return; + m_PageList->Clear(); - int max_page = m_FootprintWizard->GetNumParameterPages(); + int max_page = footprintWizard->GetNumParameterPages(); for( int i = 0; iGetParameterPageName( i ); + wxString name = footprintWizard->GetParameterPageName( i ); m_PageList->Append( name ); } @@ -417,7 +421,9 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList() if( m_ParameterGrid == NULL ) return; - if( m_FootprintWizard == NULL ) + FOOTPRINT_WIZARD* footprintWizard = GetMyWizard(); + + if( footprintWizard == NULL ) return; int page = m_PageList->GetSelection(); @@ -435,9 +441,9 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList() m_ParameterGrid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); // Get the list of names, values, and types - wxArrayString fpList = m_FootprintWizard->GetParameterNames( page ); - wxArrayString fvList = m_FootprintWizard->GetParameterValues( page ); - wxArrayString ptList = m_FootprintWizard->GetParameterTypes( page ); + wxArrayString fpList = footprintWizard->GetParameterNames( page ); + wxArrayString fvList = footprintWizard->GetParameterValues( page ); + wxArrayString ptList = footprintWizard->GetParameterTypes( page ); // Dimension the wxGrid m_ParameterGrid->DeleteRows( 0, m_ParameterGrid->GetNumberRows() ); @@ -580,9 +586,9 @@ void FOOTPRINT_WIZARD_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition cmd.SetEventObject( this ); - pos = screen->GetNearestGridPosition( pos ); - oldpos = screen->GetCrossHairPosition(); - gridSize = screen->GetGridSize(); + pos = screen->GetNearestGridPosition( pos ); + oldpos = screen->GetCrossHairPosition(); + gridSize = screen->GetGridSize(); switch( aHotKey ) { diff --git a/pcbnew/footprint_wizard_frame.h b/pcbnew/footprint_wizard_frame.h index 223b9ebcd1..d52c07311e 100644 --- a/pcbnew/footprint_wizard_frame.h +++ b/pcbnew/footprint_wizard_frame.h @@ -55,17 +55,15 @@ private: wxSashLayoutWindow* m_ParameterGridWindow; // < List of components in the selected library wxGrid* m_ParameterGrid; // < The list of parameters - wxSize m_ParameterGridSize; // < size of the window + wxSize m_ParameterGridSize; // < size of the window // Flags - wxSemaphore* m_Semaphore; // < != NULL if the frame must emulate a modal dialog - wxString m_configPath; // < subpath for configuration - - FOOTPRINT_WIZARD* m_FootprintWizard; + wxSemaphore* m_Semaphore; // < != NULL if the frame must emulate a modal dialog + wxString m_configPath; // < subpath for configuration protected: - wxString m_wizardName; // < name of the current wizard - wxString m_wizardDescription; // < description of the wizard - wxString m_wizardStatus; // < current wizard status + wxString m_wizardName; // < name of the current wizard + wxString m_wizardDescription; // < description of the wizard + wxString m_wizardStatus; // < current wizard status public: FOOTPRINT_WIZARD_FRAME( FOOTPRINT_EDIT_FRAME* parent, wxSemaphore* semaphore = NULL, @@ -73,70 +71,76 @@ public: ~FOOTPRINT_WIZARD_FRAME(); - MODULE* GetBuiltFootprint( void ); + MODULE* GetBuiltFootprint( void ); private: - void OnSize( wxSizeEvent& event ); + void OnSize( wxSizeEvent& event ); /** * Function ExportSelectedFootprint(); * will let the caller exit from the wait loop, and get the built footprint * */ - void ExportSelectedFootprint( wxCommandEvent& aEvent ); + void ExportSelectedFootprint( wxCommandEvent& aEvent ); /** * Function OnSashDrag * resizes the child windows when dragging a sash window border. */ - void OnSashDrag( wxSashEvent& event ); + void OnSashDrag( wxSashEvent& event ); /** * Function ReCreatePageList * Creates or recreates the list of parameter pages for the current wizard. * This list is sorted */ - void ReCreatePageList(); + void ReCreatePageList(); /** * Function ReCreateParameterList * Creates the list of parameters for the current page */ - void ReCreateParameterList(); + void ReCreateParameterList(); /** * Function SelectFootprintWizard * Shows the list of footprint wizards available into the system */ - void SelectFootprintWizard(); + void SelectFootprintWizard(); /** * Function ReloadFootprint * Reloads the current footprint */ - void ReloadFootprint(); + void ReloadFootprint(); + + /** + * Function GetMyWizard + * Reloads the wizard by name + */ + FOOTPRINT_WIZARD* GetMyWizard(); - void Process_Special_Functions( wxCommandEvent& event ); + void Process_Special_Functions( wxCommandEvent& event ); /** * Function DisplayWizardInfos * Shows all the details about the current wizard */ - void DisplayWizardInfos(); + void DisplayWizardInfos(); - void RedrawActiveWindow( wxDC* DC, bool EraseBg ); - void OnCloseWindow( wxCloseEvent& Event ); - void ReCreateHToolbar(); - void ReCreateVToolbar(); - void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); - void ClickOnPageList( wxCommandEvent& event ); - void OnSetRelativeOffset( wxCommandEvent& event ); + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + void OnCloseWindow( wxCloseEvent& Event ); + void ReCreateHToolbar(); + void ReCreateVToolbar(); + void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); + void ClickOnPageList( wxCommandEvent& event ); + void OnSetRelativeOffset( wxCommandEvent& event ); - void GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); + void GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); /** * Function LoadSettings @@ -145,7 +149,7 @@ private: * Don't forget to call this base method from any derived classes or the * settings will not get loaded. */ - void LoadSettings(); + void LoadSettings(); /** * Function SaveSettings @@ -154,7 +158,7 @@ private: * Don't forget to call this base method from any derived classes or the * settings will not get saved. */ - void SaveSettings(); + void SaveSettings(); /** @@ -162,20 +166,20 @@ private: * is called when the frame frame is activate to reload the libraries and component lists * that can be changed by the schematic editor or the library editor. */ - virtual void OnActivate( wxActivateEvent& event ); + virtual void OnActivate( wxActivateEvent& event ); - void SelectCurrentWizard( wxCommandEvent& event ); + void SelectCurrentWizard( wxCommandEvent& event ); - void ParametersUpdated( wxGridEvent& event ); + void ParametersUpdated( wxGridEvent& event ); - bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); + bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); /** * Function Show3D_Frame (virtual) * displays 3D view of the footprint (module) being edited. */ - void Show3D_Frame( wxCommandEvent& event ); + void Show3D_Frame( wxCommandEvent& event ); /** * Function Update3D_Frame @@ -184,7 +188,7 @@ private: * @param aForceReloadFootprint = true to reload data (default) * = false to update title only -(aftre creating the 3D viewer) */ - void Update3D_Frame( bool aForceReloadFootprint = true ); + void Update3D_Frame( bool aForceReloadFootprint = true ); /* * Virtual functions, not used here, but needed by PCB_BASE_FRAME diff --git a/pcbnew/scripting/pcbnew_footprint_wizards.cpp b/pcbnew/scripting/pcbnew_footprint_wizards.cpp index 0bacd3fbc9..857f6b76d3 100644 --- a/pcbnew/scripting/pcbnew_footprint_wizards.cpp +++ b/pcbnew/scripting/pcbnew_footprint_wizards.cpp @@ -51,10 +51,11 @@ PYTHON_FOOTPRINT_WIZARD::~PYTHON_FOOTPRINT_WIZARD() PyObject* PYTHON_FOOTPRINT_WIZARD::CallMethod( const char* aMethod, PyObject* aArglist ) { - PyLOCK lock; + PyLOCK lock; + PyErr_Clear(); // pFunc is a new reference to the desired method - PyObject* pFunc = PyObject_GetAttrString( this->m_PyWizard, aMethod ); + PyObject* pFunc = PyObject_GetAttrString( this->m_PyWizard, aMethod ); if( pFunc && PyCallable_Check( pFunc ) ) { @@ -79,6 +80,8 @@ PyObject* PYTHON_FOOTPRINT_WIZARD::CallMethod( const char* aMethod, PyObject* aA wxMessageBox( message, wxT( "Exception on python footprint wizard code" ), wxICON_ERROR | wxOK ); + + PyErr_Clear(); } if( result ) @@ -346,7 +349,10 @@ MODULE* PYTHON_FOOTPRINT_WIZARD::GetModule() PyObject* obj = PyObject_GetAttrString( result, "this" ); if( PyErr_Occurred() ) + { PyErr_Print(); + PyErr_Clear(); + } MODULE* mod = PyModule_to_MODULE( obj ); @@ -354,9 +360,22 @@ MODULE* PYTHON_FOOTPRINT_WIZARD::GetModule() } +void* PYTHON_FOOTPRINT_WIZARD::GetObject() +{ + return (void*) m_PyWizard; +} + + void PYTHON_FOOTPRINT_WIZARDS::register_wizard( PyObject* aPyWizard ) { PYTHON_FOOTPRINT_WIZARD* fw = new PYTHON_FOOTPRINT_WIZARD( aPyWizard ); fw->register_wizard(); } + + +void PYTHON_FOOTPRINT_WIZARDS::deregister_wizard( PyObject* aPyWizard ) +{ + // deregister also destroyes the previously created "PYTHON_FOOTPRINT_WIZARD object" + FOOTPRINT_WIZARDS::deregister_object( (void*) aPyWizard ); +} diff --git a/pcbnew/scripting/pcbnew_footprint_wizards.h b/pcbnew/scripting/pcbnew_footprint_wizards.h index d3e98ac244..00e74ac987 100644 --- a/pcbnew/scripting/pcbnew_footprint_wizards.h +++ b/pcbnew/scripting/pcbnew_footprint_wizards.h @@ -56,6 +56,7 @@ public: wxArrayString GetParameterErrors( int aPage ); wxString SetParameterValues( int aPage, wxArrayString& aValues ); // < must return "OK" or error description MODULE* GetModule(); + void* GetObject(); }; @@ -63,6 +64,7 @@ class PYTHON_FOOTPRINT_WIZARDS { public: static void register_wizard( PyObject* aPyWizard ); + static void deregister_wizard( PyObject* aPyWizard ); }; #endif /* PCBNEW_FOOTPRINT_WIZARDS_H */ diff --git a/pcbnew/scripting/plugins.i b/pcbnew/scripting/plugins.i index 821e2a72d1..7e7dcb7a36 100644 --- a/pcbnew/scripting/plugins.i +++ b/pcbnew/scripting/plugins.i @@ -26,9 +26,10 @@ #include %} -class PYTHON_FOOTPRINT_WIZARDS +class PYTHON_FOOTPRINT_WIZARDS { public: static void register_wizard(PyObject *wizard); + static void deregister_wizard(PyObject *wizard); }; diff --git a/scripting/kicadplugins.i b/scripting/kicadplugins.i index 300faad1a1..905afd141f 100644 --- a/scripting/kicadplugins.i +++ b/scripting/kicadplugins.i @@ -32,77 +32,110 @@ * | * |\-FilePlugin * |\-FootprintWizardPlugin - * |\-ActionPlugin + * |\-ActionPlugin * * It defines the LoadPlugins() function that loads all the plugins * available in the system * */ -%pythoncode +%pythoncode { -def LoadPlugins(): +KICAD_PLUGINS={} + +def ReloadPlugin(name): + if not KICAD_PLUGINS.has_key(name): + return False + + KICAD_PLUGINS[name]["wizard"].deregister() + + mod = reload(KICAD_PLUGINS[name]["module"]) + + KICAD_PLUGINS[name]["wizard"]= mod.register() + +def LoadPlugins(): import os import sys - # Use environment variable KICAD_PATH to derive path to plugins as a temporary solution + kicad_path = os.environ.get('KICAD_PATH') plugin_directories=[] if kicad_path and os.path.isdir(kicad_path): plugin_directories.append(os.path.join(kicad_path, 'scripting', 'plugins')) - - if sys.platform.startswith('linux'): + + if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): plugin_directories.append(os.environ['HOME']+'/.kicad_plugins/') plugin_directories.append(os.environ['HOME']+'/.kicad/scripting/plugins/') - # scan all possible directories for plugins, and load them + for plugins_dir in plugin_directories: sys.path.append(plugins_dir) - if not os.path.isdir(plugins_dir): + + if not os.path.isdir(plugins_dir): continue + for module in os.listdir(plugins_dir): if os.path.isdir(plugins_dir+module): __import__(module, locals(), globals()) if module == '__init__.py' or module[-3:] != '.py': continue - __import__(module[:-3], locals(), globals()) + + mod = __import__(module[:-3], locals(), globals()) + + + + if hasattr(mod,'register'): + KICAD_PLUGINS[module]={"filename":plugins_dir+"/"+module, + "wizard":mod.register(), + "module":mod} + -# KiCadPlugin base class will register any plugin into the right place class KiCadPlugin: def __init__(self): pass - + def register(self): if isinstance(self,FilePlugin): pass # register to file plugins in C++ if isinstance(self,FootprintWizardPlugin): PYTHON_FOOTPRINT_WIZARDS.register_wizard(self) return - + if isinstance(self,ActionPlugin): pass # register to action plugins in C++ - + return - - + def deregister(self): + if isinstance(self,FilePlugin): + pass # register to file plugins in C++ + if isinstance(self,FootprintWizardPlugin): + PYTHON_FOOTPRINT_WIZARDS.deregister_wizard(self) + return + + if isinstance(self,ActionPlugin): + pass # register to action plugins in C++ + + return + + + -# This will be the file io scripting based plugins class class FilePlugin(KiCadPlugin): def __init__(self): KiCadPlugin.__init__(self) - - -# Scriping footprint wizards + + + class FootprintWizardPlugin(KiCadPlugin): def __init__(self): KiCadPlugin.__init__(self) self.defaults() - + def defaults(self): self.module = None self.parameters = {} @@ -110,50 +143,50 @@ class FootprintWizardPlugin(KiCadPlugin): self.name = "Undefined Footprint Wizard plugin" self.description = "" self.image = "" - + def GetName(self): return self.name - + def GetImage(self): return self.image - + def GetDescription(self): return self.description - - + + def GetNumParameterPages(self): return len(self.parameters) - + def GetParameterPageName(self,page_n): return self.parameters.keys()[page_n] - + def GetParameterNames(self,page_n): name = self.GetParameterPageName(page_n) return self.parameters[name].keys() - + def GetParameterValues(self,page_n): name = self.GetParameterPageName(page_n) values = self.parameters[name].values() return map( lambda x: str(x) , values) # list elements as strings - + def GetParameterErrors(self,page_n): self.CheckParameters() name = self.GetParameterPageName(page_n) values = self.parameter_errors[name].values() return map( lambda x: str(x) , values) # list elements as strings - + def CheckParameters(self): return "" - + def TryConvertToFloat(self,value): v = value try: v = float(value) except: pass - + return v - + def SetParameterValues(self,page_n,values): name = self.GetParameterPageName(page_n) keys = self.parameters[name].keys() @@ -163,29 +196,29 @@ class FootprintWizardPlugin(KiCadPlugin): self.parameters[name][key] = val print "[%s][%s]<="%(name,key),val n+=1 - - # copies the parameter list on parameter_errors but empty + + def ClearErrors(self): errs={} - + for page in self.parameters.keys(): page_dict = self.parameters[page] page_params = {} for param in page_dict.keys(): page_params[param]="" - + errs[page]=page_params - - self.parameter_errors = errs - - + + self.parameter_errors = errs + + def GetModule(self): self.BuildFootprint() return self.module - + def BuildFootprint(self): return - + def Show(self): print "Footprint Wizard Name: ",self.GetName() print "Footprint Wizard Description: ",self.GetDescription() @@ -203,6 +236,4 @@ class ActionPlugin(KiCadPlugin): def __init__(self): KiCadPlugin.__init__(self) - - }