source: sasview/sansview/perspectives/fitting/models.py @ 1c66bc5

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 1c66bc5 was 1c66bc5, checked in by Gervaise Alina <gervyh@…>, 16 years ago

working on pluging model

  • Property mode set to 100644
File size: 3.8 KB
Line 
1import wx
2import os
3import os.path
4
5(ModelEvent, EVT_MODEL) = wx.lib.newevent.NewEvent()
6def _findModels(dir):
7    # List of plugin objects
8    plugins = []
9    # Go through files in plug-in directory
10    try:
11        list = os.listdir(dir)
12        for item in list:
13            toks = os.path.splitext(os.path.basename(item))
14            if toks[1]=='.py' and not toks[0]=='__init__':
15                name = toks[0]
16           
17                path = [os.path.abspath(dir)]
18                file = None
19                try:
20                    (file, path, info) = imp.find_module(name, path)
21                    module = imp.load_module( name, file, item, info )
22                    if hasattr(module, "Model"):
23                        try:
24                            plugins.append(module.Model)
25                        except:
26                            log("Error accessing Model in %s\n  %s" % (name, sys.exc_value))
27                except:
28                    pass
29                finally:
30                    if not file==None:
31                        file.close()
32    except:
33        pass
34    return plugins
35
36
37class ModelManager:
38   
39    ## Dictionary of models
40    model_list = {}
41    model_list_box = {}
42    ## Event owner
43    event_owner = None
44   
45    def _getModelList(self):
46        """
47            List of models we want to make available by default
48            for this application
49           
50            @param id: first event ID to register the menu events with
51            @return: the next free event ID following the new menu events
52        """
53        self.model_list = {}
54        self.model_list_box = {}
55        from sans.models.CylinderModel import CylinderModel
56        self.model_list[str(wx.NewId())] = CylinderModel
57     
58        from sans.models.SphereModel import SphereModel
59        self.model_list[str(wx.NewId())] = SphereModel
60   
61        from sans.guitools.LineModel import LineModel
62        self.model_list[str(wx.NewId())]  = LineModel
63     
64        return 0
65
66   
67    def populate_menu(self, modelmenu, event_owner):
68        """
69            Populate a menu with our models
70           
71            @param id: first menu event ID to use when binding the menu events
72            @param modelmenu: wx.Menu object to populate
73            @param event_owner: wx object to bind the menu events to
74            @return: the next free event ID following the new menu events
75        """
76       
77        self._getModelList()
78        self.event_owner = event_owner
79
80        for id_str,value in self.model_list.iteritems():
81            item = self.model_list[id_str]
82           
83            name = item.__name__
84            if hasattr(item, "name"):
85                name = item.name
86               
87            self.model_list_box[name] =value
88           
89            modelmenu.Append(int(id_str), name, name)
90            wx.EVT_MENU(event_owner, int(id_str), self._on_model)       
91   
92        return 0
93   
94    def _on_model(self, evt):
95        """
96            React to a model menu event
97            @param event: wx menu event
98        """
99        if str(evt.GetId()) in self.model_list.keys():
100            # Notify the application manager that a new model has been set
101            #self.app_manager.set_model(self.model_list[str(evt.GetId())]())
102           
103            #TODO: post a model event to update all panels that need
104            #evt = ModelEvent(model=self.model_list[str(evt.GetId())]())
105           
106            model = self.model_list[str(evt.GetId())]()
107            evt = ModelEvent(model=model)
108            wx.PostEvent(self.event_owner, evt)
109       
110    def get_model_list(self):   
111        """ @ return dictionary of models for fitpanel use """
112        return self.model_list_box
113   
114   
115   
116 
Note: See TracBrowser for help on using the repository browser.