source: sasview/sansview/perspectives/fitting/models.py @ fa5908de

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 fa5908de was 49b7efa, checked in by Gervaise Alina <gervyh@…>, 16 years ago

working on model window display

  • Property mode set to 100644
File size: 6.8 KB
RevLine 
[d89f09b]1import wx
[b30f001]2import imp
3import os,sys
[d89f09b]4import os.path
5
6(ModelEvent, EVT_MODEL) = wx.lib.newevent.NewEvent()
[49b7efa]7class ModelInfo(object):
8    def __init__(self,model,description=None):
9        self.model=model
10        self.description=description
11    def set_description(self, descrition):
12        self.description =str(description)
13    def get_description(self):
14        return self.description
[b30f001]15def log(message):
16    print message
17    out = open("plugins.log", 'a')
18    out.write("%10g%s\n" % (time.clock(), message))
19    out.close()
20
[aa92772]21def findModels():
22    print "looking for models"
[b30f001]23    if os.path.isdir('plugins'):
24        return _findModels('plugins')
25    return []
[aa92772]26   
[1c66bc5]27def _findModels(dir):
28    # List of plugin objects
29    plugins = []
30    # Go through files in plug-in directory
31    try:
32        list = os.listdir(dir)
33        for item in list:
34            toks = os.path.splitext(os.path.basename(item))
35            if toks[1]=='.py' and not toks[0]=='__init__':
36                name = toks[0]
37           
38                path = [os.path.abspath(dir)]
39                file = None
40                try:
41                    (file, path, info) = imp.find_module(name, path)
[b30f001]42                    print "models:module ",file
[1c66bc5]43                    module = imp.load_module( name, file, item, info )
[b30f001]44                    print "models:module ",module
[1c66bc5]45                    if hasattr(module, "Model"):
46                        try:
47                            plugins.append(module.Model)
48                        except:
49                            log("Error accessing Model in %s\n  %s" % (name, sys.exc_value))
50                except:
[b30f001]51                    log("Error accessing Model in %s\n  %s" % (name, sys.exc_value))
[1c66bc5]52                finally:
53                    if not file==None:
54                        file.close()
55    except:
56        pass
57    return plugins
[d89f09b]58class ModelManager:
59   
60    ## Dictionary of models
61    model_list = {}
[49b7efa]62    indep_model_list = {}
[d89f09b]63    model_list_box = {}
[b30f001]64    custom_models={}
65    plugins=[]
[49b7efa]66    indep_model=[]
[d89f09b]67    ## Event owner
68    event_owner = None
69   
70    def _getModelList(self):
71        """
72            List of models we want to make available by default
73            for this application
74           
75            @param id: first event ID to register the menu events with
76            @return: the next free event ID following the new menu events
77        """
78        self.model_list = {}
79        self.model_list_box = {}
[49b7efa]80        model_info="shape-based models"
[d89f09b]81        from sans.models.CylinderModel import CylinderModel
[49b7efa]82        self.model_list[str(wx.NewId())] = ModelInfo(CylinderModel , model_info)
[d89f09b]83     
84        from sans.models.SphereModel import SphereModel
[49b7efa]85        self.model_list[str(wx.NewId())] =  ModelInfo(SphereModel , model_info)
[d89f09b]86   
87        from sans.guitools.LineModel import LineModel
[49b7efa]88        self.model_list[str(wx.NewId())]  = ModelInfo(LineModel , model_info)
89        model_info="shape-independent models"
90        from sans.models.Lorentzian import Lorentzian
91        self.indep_model.append( ModelInfo(Lorentzian , model_info) )
[b30f001]92       
[49b7efa]93        #Looking for plugins
94        self.plugins = findModels()
95       
[d89f09b]96        return 0
97
98   
99    def populate_menu(self, modelmenu, event_owner):
100        """
101            Populate a menu with our models
102           
103            @param id: first menu event ID to use when binding the menu events
104            @param modelmenu: wx.Menu object to populate
105            @param event_owner: wx object to bind the menu events to
106            @return: the next free event ID following the new menu events
107        """
108        self._getModelList()
109        self.event_owner = event_owner
[49b7efa]110       
[b30f001]111        shape_submenu= wx.Menu() 
112        indep_submenu = wx.Menu()
113        added_models = wx.Menu()
[49b7efa]114       
[d89f09b]115        for id_str,value in self.model_list.iteritems():
116            item = self.model_list[id_str]
[49b7efa]117            name = item.model.__name__
[d89f09b]118            if hasattr(item, "name"):
[49b7efa]119                name = item.model.name
120            self.model_list_box[name] =value.model
[b30f001]121            shape_submenu.Append(int(id_str), name, name)
122            wx.EVT_MENU(event_owner, int(id_str), self._on_model)
123        modelmenu.AppendMenu(wx.NewId(), "Shapes...", shape_submenu, "List of shape-based models")
124       
125        id = wx.NewId()
[49b7efa]126        if len(self.indep_model_list) == 0:
127            print "models: self.indep_model",self.indep_model
128            for item in self.indep_model:
129                if item not in self.indep_model_list.values():
130                    self.indep_model_list[str(id)] = item
131                    self.model_list[str(id)]=item
132                    if hasattr(item, "name"):
133                        name = item.model.name
134                    else:
135                        name = item.model.__name__
136                    indep_submenu.Append(id,name, name)
137                    self.model_list_box[name] =item.model
138                    wx.EVT_MENU(event_owner, int(id), self._on_model)
139                    id = wx.NewId()         
140        modelmenu.AppendMenu(wx.NewId(), "Shape-independent...", indep_submenu, "List of shape-independent models")
141        model_info="additional models"
142        id = wx.NewId()
[b30f001]143        if len(self.custom_models) == 0:
144            for item in self.plugins:
[49b7efa]145                if item not in self.custom_models.values():
[b30f001]146                    self.custom_models[str(id)] = item
[49b7efa]147                   
148                    self.model_list[str(id)]=ModelInfo(item,model_info)
149                    if hasattr(item, "name"):
150                        name = item.name
151                    else:
152                        name = item.__name__
153                    added_models.Append(id, name, name)
154                    self.model_list_box[name] =item
[b30f001]155                    wx.EVT_MENU(event_owner, int(id), self._on_model)
156                    id = wx.NewId()
157        modelmenu.AppendMenu(wx.NewId(),"Added models...", added_models, "List of additional models")
158       
159       
[d89f09b]160        return 0
161   
162    def _on_model(self, evt):
163        """
164            React to a model menu event
165            @param event: wx menu event
166        """
167        if str(evt.GetId()) in self.model_list.keys():
168            # Notify the application manager that a new model has been set
169            #self.app_manager.set_model(self.model_list[str(evt.GetId())]())
170           
171            #TODO: post a model event to update all panels that need
172            #evt = ModelEvent(model=self.model_list[str(evt.GetId())]())
173           
[49b7efa]174            model = self.model_list[str(evt.GetId())]
175            evt = ModelEvent(modelinfo=model)
[d89f09b]176            wx.PostEvent(self.event_owner, evt)
177       
178    def get_model_list(self):   
179        """ @ return dictionary of models for fitpanel use """
180        return self.model_list_box
181   
182   
183   
184 
Note: See TracBrowser for help on using the repository browser.