Changeset 225aca8 in sasview for src/sas


Ignore:
Timestamp:
Jul 28, 2015 12:14:38 PM (9 years ago)
Author:
mathieu
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
a910c788
Parents:
ae2a197 (diff), d06c34c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge pull request #3 from SasView?/standalone_cleanup

Standalone cleanup

Location:
src/sas
Files:
2 added
30 edited

Legend:

Unmodified
Added
Removed
  • src/sas/guiframe/gui_manager.py

    r957af0d r225aca8  
    235235        Initialize the Frame object 
    236236        """ 
    237  
    238237        PARENT_FRAME.__init__(self, parent=parent, title=title, pos=pos, size=size) 
    239238        # title 
     
    364363                    frame.SetIcon(icon) 
    365364                except: 
    366                     pass 
     365                    logging.error("ViewerFrame.put_icon: could not set icon") 
    367366 
    368367    def get_client_size(self): 
     
    752751            self._toolbar.Realize() 
    753752 
    754  
    755753    def build_gui(self): 
    756754        """ 
     
    778776        # Append item from plugin under menu file if necessary 
    779777        self._populate_file_menu() 
    780  
    781778 
    782779        if not wx.VERSION_STRING >= '3.0.0.0': 
     
    822819        # Load panels 
    823820        self._load_panels() 
    824         self.set_default_perspective() 
    825821 
    826822    def SetStatusText(self, *args, **kwds): 
     
    931927                        if hasattr(module, "PLUGIN_ID"): 
    932928                            try: 
    933                                 plug = module.Plugin() 
    934                                 if plug.set_default_perspective(): 
    935                                     self._current_perspective = plug 
    936                                 plugins.append(plug) 
    937  
     929                                plugins.append(module.Plugin()) 
    938930                                msg = "Found plug-in: %s" % module.PLUGIN_ID 
    939931                                logging.info(msg) 
     
    15111503                for item in plugin.populate_file_menu(): 
    15121504                    m_name, m_hint, m_handler = item 
    1513                     id = wx.NewId() 
    1514                     self._file_menu.Append(id, m_name, m_hint) 
    1515                     wx.EVT_MENU(self, id, m_handler) 
     1505                    wx_id = wx.NewId() 
     1506                    self._file_menu.Append(wx_id, m_name, m_hint) 
     1507                    wx.EVT_MENU(self, wx_id, m_handler) 
    15161508                self._file_menu.AppendSeparator() 
    15171509 
    15181510        style1 = self.__gui_style & GUIFRAME.MULTIPLE_APPLICATIONS 
    15191511        if OPEN_SAVE_MENU: 
    1520             id = wx.NewId() 
     1512            wx_id = wx.NewId() 
    15211513            hint_load_file = "read all analysis states saved previously" 
    1522             self._save_appl_menu = self._file_menu.Append(id, '&Open Project', hint_load_file) 
    1523             wx.EVT_MENU(self, id, self._on_open_state_project) 
     1514            self._save_appl_menu = self._file_menu.Append(wx_id, '&Open Project', hint_load_file) 
     1515            wx.EVT_MENU(self, wx_id, self._on_open_state_project) 
    15241516 
    15251517        if style1 == GUIFRAME.MULTIPLE_APPLICATIONS: 
     
    15271519            hint_load_file = "Read a status files and load" 
    15281520            hint_load_file += " them into the analysis" 
    1529             id = wx.NewId() 
    1530             self._save_appl_menu = self._file_menu.Append(id, 
     1521            wx_id = wx.NewId() 
     1522            self._save_appl_menu = self._file_menu.Append(wx_id, 
    15311523                                                          '&Open Analysis', hint_load_file) 
    1532             wx.EVT_MENU(self, id, self._on_open_state_application) 
     1524            wx.EVT_MENU(self, wx_id, self._on_open_state_application) 
    15331525        if OPEN_SAVE_MENU: 
    15341526            self._file_menu.AppendSeparator() 
    1535             id = wx.NewId() 
    1536             self._file_menu.Append(id, '&Save Project', 
     1527            wx_id = wx.NewId() 
     1528            self._file_menu.Append(wx_id, '&Save Project', 
    15371529                                   'Save the state of the whole analysis') 
    1538             wx.EVT_MENU(self, id, self._on_save_project) 
     1530            wx.EVT_MENU(self, wx_id, self._on_save_project) 
    15391531        if style1 == GUIFRAME.MULTIPLE_APPLICATIONS: 
    1540             id = wx.NewId() 
    1541             self._save_appl_menu = self._file_menu.Append(id, \ 
     1532            wx_id = wx.NewId() 
     1533            self._save_appl_menu = self._file_menu.Append(wx_id, \ 
    15421534                '&Save Analysis', 'Save state of the current active analysis panel') 
    1543             wx.EVT_MENU(self, id, self._on_save_application) 
     1535            wx.EVT_MENU(self, wx_id, self._on_save_application) 
    15441536        if not sys.platform == 'darwin': 
    15451537            self._file_menu.AppendSeparator() 
    1546             id = wx.NewId() 
    1547             self._file_menu.Append(id, '&Quit', 'Exit') 
    1548             wx.EVT_MENU(self, id, self.Close) 
     1538            wx_id = wx.NewId() 
     1539            self._file_menu.Append(wx_id, '&Quit', 'Exit') 
     1540            wx.EVT_MENU(self, wx_id, self.Close) 
    15491541 
    15501542    def _add_menu_file(self): 
     
    17171709        """ 
    17181710        """ 
    1719         message = "" 
    17201711        log_msg = '' 
    1721         output = [] 
    1722         error_message = "" 
    17231712        basename = os.path.basename(path) 
    1724         root, extension = os.path.splitext(basename) 
     1713        _, extension = os.path.splitext(basename) 
    17251714        if extension.lower() not in EXTENSIONS: 
    17261715            log_msg = "File Loader cannot " 
     
    22242213            if hasattr(item, "post_init"): 
    22252214                item.post_init() 
    2226  
    2227     def set_default_perspective(self): 
    2228         """ 
    2229         Choose among the plugin the first plug-in that has 
    2230         "set_default_perspective" method and its return value is True will be 
    2231         as a default perspective when the welcome page is closed 
    2232         """ 
    2233         for item in self.plugins: 
    2234             if hasattr(item, "set_default_perspective"): 
    2235                 if item.set_default_perspective(): 
    2236                     item.on_perspective(event=None) 
    2237                     return 
    22382215 
    22392216    def set_perspective(self, panels): 
     
    24142391            total_plot_list.append(theory_data) 
    24152392        for new_plot in total_plot_list: 
    2416             id = new_plot.id 
    24172393            for group_id in new_plot.list_group_id: 
    2418                 wx.PostEvent(self, NewPlotEvent(id=id, 
     2394                wx.PostEvent(self, NewPlotEvent(id=new_plot.id, 
    24192395                                                group_id=group_id, 
    24202396                                                action='remove')) 
    24212397                #remove res plot: Todo: improve 
    2422                 wx.CallAfter(self._remove_res_plot, id) 
     2398                wx.CallAfter(self._remove_res_plot, new_plot.id) 
    24232399        self._data_manager.delete_data(data_id=data_id, 
    24242400                                       theory_id=theory_id) 
     
    24552431            ext_num = dlg.GetFilterIndex() 
    24562432            if ext_num == 0: 
    2457                 format = '.txt' 
     2433                ext_format = '.txt' 
    24582434            else: 
    2459                 format = '.xml' 
    2460             path = os.path.splitext(path)[0] + format 
     2435                ext_format = '.xml' 
     2436            path = os.path.splitext(path)[0] + ext_format 
    24612437            mypath = os.path.basename(path) 
    24622438 
    24632439            #Instantiate a loader 
    24642440            loader = Loader() 
    2465             format = ".txt" 
    2466             if os.path.splitext(mypath)[1].lower() == format: 
     2441            ext_format = ".txt" 
     2442            if os.path.splitext(mypath)[1].lower() == ext_format: 
    24672443                # Make sure the ext included in the file name 
    24682444                # especially on MAC 
    2469                 fName = os.path.splitext(path)[0] + format 
     2445                fName = os.path.splitext(path)[0] + ext_format 
    24702446                self._onsaveTXT(data, fName) 
    2471             format = ".xml" 
    2472             if os.path.splitext(mypath)[1].lower() == format: 
     2447            ext_format = ".xml" 
     2448            if os.path.splitext(mypath)[1].lower() == ext_format: 
    24732449                # Make sure the ext included in the file name 
    24742450                # especially on MAC 
    2475                 fName = os.path.splitext(path)[0] + format 
    2476                 loader.save(fName, data, format) 
     2451                fName = os.path.splitext(path)[0] + ext_format 
     2452                loader.save(fName, data, ext_format) 
    24772453            try: 
    24782454                self._default_save_location = os.path.dirname(path) 
     
    25982574            ext_num = dlg.GetFilterIndex() 
    25992575            if ext_num == 0: 
    2600                 format = '.dat' 
     2576                ext_format = '.dat' 
    26012577            else: 
    2602                 format = '' 
    2603             path = os.path.splitext(path)[0] + format 
     2578                ext_format = '' 
     2579            path = os.path.splitext(path)[0] + ext_format 
    26042580            mypath = os.path.basename(path) 
    26052581 
     
    26072583            loader = Loader() 
    26082584 
    2609             format = ".dat" 
    2610             if os.path.splitext(mypath)[1].lower() == format: 
     2585            ext_format = ".dat" 
     2586            if os.path.splitext(mypath)[1].lower() == ext_format: 
    26112587                # Make sure the ext included in the file name 
    26122588                # especially on MAC 
    2613                 fileName = os.path.splitext(path)[0] + format 
    2614                 loader.save(fileName, data, format) 
     2589                fileName = os.path.splitext(path)[0] + ext_format 
     2590                loader.save(fileName, data, ext_format) 
    26152591            try: 
    26162592                self._default_save_location = os.path.dirname(path) 
     
    32063182 
    32073183 
    3208 class ViewApp(wx.App): 
     3184class SasViewApp(wx.App): 
    32093185    """ 
    3210     Toy application to test this Frame 
     3186    SasView application 
    32113187    """ 
    32123188    def OnInit(self): 
     
    32943270            if len(os.listdir(model_folder)) > 0: 
    32953271                try: 
    3296                     for file in os.listdir(model_folder): 
    3297                         file_path = os.path.join(model_folder, file) 
     3272                    for filename in os.listdir(model_folder): 
     3273                        file_path = os.path.join(model_folder, filename) 
    32983274                        if os.path.isfile(file_path): 
    32993275                            os.remove(file_path) 
     
    33143290        """ 
    33153291        #try to load file at the start 
    3316         try: 
    3317             self.open_file() 
    3318         except: 
    3319             raise 
     3292        self.open_file() 
    33203293        self.frame.build_gui() 
    33213294 
  • src/sas/guiframe/local_perspectives/data_loader/data_loader.py

    rf76bf17 rf21d496  
    4141class Plugin(PluginBase): 
    4242 
    43     def __init__(self, standalone=False): 
    44         PluginBase.__init__(self, name="DataLoader", standalone=standalone) 
     43    def __init__(self): 
     44        PluginBase.__init__(self, name="DataLoader") 
    4545        # Default location 
    4646        self._default_save_location = DEFAULT_OPEN_FOLDER 
  • src/sas/guiframe/local_perspectives/plotting/plotting.py

    rc039589 rf21d496  
    3636    """ 
    3737 
    38     def __init__(self, standalone=False): 
    39         PluginBase.__init__(self, name="Plotting", standalone=standalone) 
     38    def __init__(self): 
     39        PluginBase.__init__(self, name="Plotting") 
    4040 
    4141        ## Plot panels 
  • src/sas/guiframe/plugin_base.py

    r373d4ee rf21d496  
    3434    """ 
    3535 
    36     def __init__(self, name="Test_plugin", standalone=True): 
     36    def __init__(self, name="Test_plugin"): 
    3737        """ 
    3838        Abstract class for gui_manager Plugins. 
     
    4242        ## Plug-in name. It will appear on the application menu. 
    4343        self.sub_menu = name 
    44         #standalone flag 
    45         self.standalone = standalone 
    4644        ## Reference to the parent window. Filled by get_panels() below. 
    4745        self.parent = None 
     
    263261        pass 
    264262 
    265     def set_default_perspective(self): 
    266         """ 
    267        Call back method that True to notify the parent that the current plug-in 
    268        can be set as default  perspective. 
    269        when returning False, the plug-in is not candidate for an automatic 
    270        default perspective setting 
    271         """ 
    272         if self.standalone: 
    273             return True 
    274         return False 
    275  
    276263    def set_state(self, state=None, datainfo=None):     
    277264        """ 
  • src/sas/perspectives/calculator/calculator.py

    r49ab5d7 rf21d496  
    3333    for calculator perspective 
    3434    """ 
    35     def __init__(self, standalone=True): 
    36         PluginBase.__init__(self, name="Calculator", standalone=standalone) 
     35    def __init__(self): 
     36        PluginBase.__init__(self, name="Calculator") 
    3737        # Log startup 
    3838        logging.info("Calculator plug-in started") 
  • src/sas/perspectives/fitting/fitpage.py

    r098f3d2 r225aca8  
    268268        weighting_box.Add(sizer_weighting) 
    269269 
    270         sizer_fit = wx.GridSizer(2, 5, 2, 6) 
    271  
    272270        # combobox for smear2d accuracy selection 
    273271        self.smear_accuracy = wx.ComboBox(self, -1, size=(50, -1), 
     
    282280 
    283281        #Fit button 
    284         self.btFit = wx.Button(self, wx.NewId(), 'Fit', size=(88, 25)) 
     282        self.btFit = wx.Button(self, wx.NewId(), 'Fit') 
    285283        self.default_bt_colour = self.btFit.GetDefaultAttributes() 
    286284        self.btFit.Bind(wx.EVT_BUTTON, self._onFit, id=self.btFit.GetId()) 
     
    288286 
    289287        #General Help button 
    290         self.btFitHelp = wx.Button(self, -1, 'HELP') 
    291         self.btFitHelp.SetToolTipString("General Fitting Help.") 
     288        self.btFitHelp = wx.Button(self, -1, 'Help') 
     289        self.btFitHelp.SetToolTipString("General fitting help.") 
    292290        self.btFitHelp.Bind(wx.EVT_BUTTON, self._onFitHelp) 
    293291         
     
    303301        self.btSmearHelp = wx.Button(self, -1, '?', style=wx.BU_EXACTFIT,\ 
    304302                                     size=size_q) 
    305         self.btSmearHelp.SetToolTipString("Resolution Smearing Help.") 
     303        self.btSmearHelp.SetToolTipString("Resolution smearing help.") 
    306304        self.btSmearHelp.Bind(wx.EVT_BUTTON, self._onSmearHelp) 
    307305         
     
    362360        self.disable_smearer.SetValue(True) 
    363361 
    364         # add 4 types of smearing to the sizer 
    365         # Note from June 14, 2015 
    366         # removed the extra (10,10) spaces to make room for help.  Actually 
    367         # don't see the need for those anyway as the wx.LEFT, xx should take 
    368         # care of spacing anyway though it does not seem to work for some 
    369         # reason.  Currently leaving as we are in "code freeze" only making 
    370         # minimal changes necessary for release 3.1.  We probably want to clean 
    371         # up the whole fitpage (and basepage and fitpanel etc) eventually. 
    372         #                          ---- PDB 
    373362        sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) 
    374 #        sizer_smearer.Add((10, 10)) 
    375363        sizer_smearer.Add(self.enable_smearer) 
    376 #        sizer_smearer.Add((10, 10)) 
    377364        sizer_smearer.Add(self.pinhole_smearer) 
    378 #        sizer_smearer.Add((10, 10)) 
    379365        sizer_smearer.Add(self.slit_smearer) 
    380 #        sizer_smearer.Add((10, 10)) 
    381366        sizer_smearer.Add(self.btSmearHelp) 
    382367        sizer_smearer.Add((10, 10)) 
     
    397382 
    398383        # Update and Draw button 
    399         self.draw_button = wx.Button(self, wx.NewId(), 
    400                                      'Compute', size=(88, 24)) 
     384        self.draw_button = wx.Button(self, wx.NewId(), 'Compute') 
    401385        self.draw_button.Bind(wx.EVT_BUTTON, \ 
    402386                              self._onDraw, id=self.draw_button.GetId()) 
     
    414398        box_description_1 = wx.StaticText(self, -1, '   Chi2/Npts') 
    415399        box_description_2 = wx.StaticText(self, -1, 'Npts(Fit)') 
    416         #box_description_3 = wx.StaticText(self, -1, 'Total Npts') 
    417         #box_description_3.SetToolTipString( \ 
    418         #                        " Total Npts : total number of data points") 
    419  
    420         sizer_fit.Add(box_description_1, 0, 0) 
    421         sizer_fit.Add(box_description_2, 0, 0) 
    422         sizer_fit.Add(self.points_sizer, 0, 0) 
    423         #sizer_fit.Add(box_description_3, 0, 0) 
    424         sizer_fit.Add(self.draw_button, 0, 0) 
    425         sizer_fit.Add((-1,5)) 
    426         sizer_fit.Add(self.tcChi, 0, 0) 
    427         sizer_fit.Add(self.Npts_fit, 0, 0) 
    428         sizer_fit.Add(self.Npts_total, 0, 0) 
    429         sizer_fit.Add(self.btFit, 0, 0) 
    430         sizer_fit.Add(self.btFitHelp, 0, 0) 
    431400 
    432401        # StaticText for smear 
     
    576545        self.qmin.Bind(wx.EVT_TEXT, self.on_qrange_text) 
    577546        self.qmax.Bind(wx.EVT_TEXT, self.on_qrange_text) 
    578         id = wx.NewId() 
    579         self.reset_qrange = wx.Button(self, id, 'Reset', size=(77, 20)) 
    580  
    581         self.reset_qrange.Bind(wx.EVT_BUTTON, self.on_reset_clicked, id=id) 
     547        wx_id = wx.NewId() 
     548        self.reset_qrange = wx.Button(self, wx_id, 'Reset') 
     549 
     550        self.reset_qrange.Bind(wx.EVT_BUTTON, self.on_reset_clicked, id=wx_id) 
    582551        self.reset_qrange.SetToolTipString("Reset Q range to the default") 
    583552 
    584         sizer = wx.GridSizer(2, 4, 2, 6) 
    585  
    586         self.btEditMask = wx.Button(self, wx.NewId(), 'Editor', size=(88, 23)) 
     553        sizer = wx.GridSizer(5, 5, 2, 6) 
     554 
     555        self.btEditMask = wx.Button(self, wx.NewId(), 'Editor') 
    587556        self.btEditMask.Bind(wx.EVT_BUTTON, self._onMask, 
    588557                             id=self.btEditMask.GetId()) 
     
    594563        sizer.Add(wx.StaticText(self, -1, ' Max[1/A]')) 
    595564        sizer.Add(self.EditMask_title) 
     565        sizer.Add((-1,5)) 
     566 
    596567        sizer.Add(self.reset_qrange) 
    597568        sizer.Add(self.qmin) 
    598569        sizer.Add(self.qmax) 
    599         #sizer.Add(self.theory_npts_tcrtl) 
    600570        sizer.Add(self.btEditMask) 
     571        sizer.Add((-1,5)) 
     572 
     573        sizer.AddMany(5*[(-1,5)]) 
     574 
     575        sizer.Add(box_description_1, 0, 0) 
     576        sizer.Add(box_description_2, 0, 0) 
     577        sizer.Add(self.points_sizer, 0, 0) 
     578        sizer.Add(self.draw_button, 0, 0) 
     579        sizer.Add((-1,5)) 
     580         
     581        sizer.Add(self.tcChi, 0, 0) 
     582        sizer.Add(self.Npts_fit, 0, 0) 
     583        sizer.Add(self.Npts_total, 0, 0) 
     584        sizer.Add(self.btFit, 0, 0) 
     585        sizer.Add(self.btFitHelp, 0, 0) 
     586         
    601587        boxsizer_range.Add(sizer_chi2) 
    602         boxsizer_range.Add((10, 10)) 
    603588        boxsizer_range.Add(sizer) 
    604  
    605         boxsizer_range.Add((10, 15)) 
    606         boxsizer_range.Add(sizer_fit) 
    607589        if is_2Ddata: 
    608590            self.btEditMask.Enable() 
  • src/sas/perspectives/fitting/fitting.py

    r098f3d2 r225aca8  
    6161    Fitting plugin is used to perform fit 
    6262    """ 
    63     def __init__(self, standalone=False): 
    64         PluginBase.__init__(self, name="Fitting", standalone=standalone) 
     63    def __init__(self): 
     64        PluginBase.__init__(self, name="Fitting") 
    6565 
    6666        #list of panel to send to guiframe 
     
    221221        Get the python editor panel 
    222222        """ 
    223         id = event.GetId() 
    224         label = self.edit_menu.GetLabel(id) 
     223        event_id = event.GetId() 
     224        label = self.edit_menu.GetLabel(event_id) 
    225225        from sas.perspectives.calculator.pyconsole import PyConsole 
    226226        filename = os.path.join(models.find_plugins_dir(), label) 
     
    236236        Delete custom model file 
    237237        """ 
    238         id = event.GetId() 
    239         label = self.delete_menu.GetLabel(id) 
     238        event_id = event.GetId() 
     239        label = self.delete_menu.GetLabel(event_id) 
    240240        toks = os.path.splitext(label) 
    241241        path = os.path.join(models.find_plugins_dir(), toks[0]) 
     
    256256                #                                      info='warning')) 
    257257            else: 
    258                 self.delete_menu.Delete(id) 
     258                self.delete_menu.Delete(event_id) 
    259259                for item in self.edit_menu.GetMenuItems(): 
    260260                    if item.GetLabel() == label: 
     
    272272        Edit summodel template and make one 
    273273        """ 
    274         id = event.GetId() 
     274        event_id = event.GetId() 
    275275        model_manager = models.ModelManager() 
    276276        model_list = model_manager.get_model_name_list() 
     
    290290            self.new_model_frame.Show(True) 
    291291        else: 
    292             id = event.GetId() 
     292            event_id = event.GetId() 
    293293            dir_path = models.find_plugins_dir() 
    294294            title = "New Custom Model Function" 
     
    332332        Set list of the edit model menu labels 
    333333        """ 
    334         id = wx.NewId() 
     334        wx_id = wx.NewId() 
    335335        #new_model_menu = wx.Menu() 
    336         self.edit_model_menu.Append(id, 'New', 
     336        self.edit_model_menu.Append(wx_id, 'New', 
    337337                                   'Add a new model function') 
    338         wx.EVT_MENU(owner, id, self.make_new_model) 
    339         id = wx.NewId() 
    340         self.edit_model_menu.Append(id, 'Sum|Multi(p1, p2)', 
     338        wx.EVT_MENU(owner, wx_id, self.make_new_model) 
     339        wx_id = wx.NewId() 
     340        self.edit_model_menu.Append(wx_id, 'Sum|Multi(p1, p2)', 
    341341                                    'Sum of two model functions') 
    342         wx.EVT_MENU(owner, id, self.make_sum_model) 
     342        wx.EVT_MENU(owner, wx_id, self.make_sum_model) 
    343343        e_id = wx.NewId() 
    344344        self.edit_menu = wx.Menu() 
     
    376376                        has_file = True 
    377377                if not has_file: 
    378                     id = wx.NewId() 
    379                     submenu.Append(id, name) 
    380                     wx.EVT_MENU(owner, id, menu) 
     378                    wx_id = wx.NewId() 
     379                    submenu.Append(wx_id, name) 
     380                    wx.EVT_MENU(owner, wx_id, menu) 
    381381                    has_file = False 
    382382 
     
    397397        Create a page to access simultaneous fit option 
    398398        """ 
    399         id = event.GetId() 
     399        event_id = event.GetId() 
    400400        caption = "Const & Simul Fit" 
    401401        page = self.sim_page 
    402         if id == self.id_batchfit: 
     402        if event_id == self.id_batchfit: 
    403403            caption = "Combined Batch" 
    404404            page = self.batch_page 
     
    719719        for uid, value in self.page_finder.iteritems(): 
    720720            if uid != sim_page_id and uid != self.batch_page.uid: 
    721                 list = value.get_model() 
    722                 model = list[0] 
     721                model_list = value.get_model() 
     722                model = model_list[0] 
    723723                if model.name == modelname: 
    724724                    value.set_model_param(names, values) 
     
    15681568        """ 
    15691569        if event.panel is not None: 
    1570             new_panel = event.panel 
    15711570            self.slicer_panels.append(event.panel) 
    15721571            # Set group ID if available 
     
    16521651            #find if this theory was already plotted and replace that plot given 
    16531652            #the same id 
    1654             theory_data = self.page_finder[page_id].get_theory_data(fid=data.id) 
     1653            self.page_finder[page_id].get_theory_data(fid=data.id) 
    16551654 
    16561655            if data.is_data: 
  • src/sas/perspectives/invariant/invariant.py

    r824e488 rf21d496  
    3333    """ 
    3434 
    35     def __init__(self, standalone=False): 
    36         PluginBase.__init__(self, name="Invariant", standalone=standalone) 
     35    def __init__(self): 
     36        PluginBase.__init__(self, name="Invariant") 
    3737 
    3838        # dictionary containing data name and error on dy of that data 
  • src/sas/perspectives/pr/inversion_panel.py

    r3db44fb rf21d496  
    3535    oscillation_max = 1.5 
    3636 
    37     def __init__(self, parent, id=-1, plots=None, standalone=False, **kwargs): 
     37    def __init__(self, parent, id=-1, plots=None, **kwargs): 
    3838        """ 
    3939        """ 
     
    8383        ## Data manager 
    8484        self._manager = None 
    85         ## Standalone flage 
    86         self.standalone = standalone 
    8785        ## Default file location for save 
    8886        self._default_save_location = os.getcwd() 
  • src/sas/perspectives/pr/pr.py

    rc1c14ba rf21d496  
    5454    DEFAULT_DMAX = 140.0 
    5555 
    56     def __init__(self, standalone=True): 
    57         PluginBase.__init__(self, name="Pr Inversion", standalone=standalone) 
     56    def __init__(self): 
     57        PluginBase.__init__(self, name="Pr Inversion") 
    5858        ## Simulation window manager 
    5959        self.simview = None 
     
    9494        ## Number of P(r) points to display on the output plot 
    9595        self._pr_npts = 51 
    96         ## Flag to let the plug-in know that it is running standalone 
    97         self.standalone = standalone 
    9896        self._normalize_output = False 
    9997        self._scale_output_unity = False 
     
    623621            return [] 
    624622        elif item.id == graph.selected_plottable: 
    625             if not self.standalone and issubclass(item.__class__, Data1D): 
     623            if issubclass(item.__class__, Data1D): 
    626624                return [["Compute P(r)", 
    627625                         "Compute P(r) from distribution", 
     
    12381236        self.frame = MDIFrame(self.parent, None, 'None', (100, 200)) 
    12391237        self.control_panel = InversionControl(self.frame, -1, 
    1240                                               style=wx.RAISED_BORDER, 
    1241                                               standalone=self.standalone) 
     1238                                              style=wx.RAISED_BORDER) 
    12421239        self.frame.set_panel(self.control_panel) 
    12431240        self._frame_set_helper() 
     
    13171314            [Somehow openGL needs this call] 
    13181315        """ 
    1319         if self.standalone: 
    1320             self.parent.set_perspective(self.perspective) 
     1316        pass 
  • src/sas/guiframe/config.py

    r5846bb5 r9989a6a  
    1010__build__ = '1' 
    1111__download_page__ = 'https://github.com/SasView/sasview/releases' 
    12 __update_URL__ = ['raw.githubusercontent.com', 
    13                   '/SasView/sasview/master/sasview.latestversion'] 
     12__update_URL__ = 'http://www.sasview.org/latestversion.json' 
    1413 
    1514 
  • src/sas/guiframe/data_processor.py

    re54dbc3e r44d20af  
    11""" 
    2 Implement grid used to store data 
     2Implement grid used to store results of a batch fit. 
     3 
     4This is in Guiframe rather than fitting which is probably where it should be. 
     5Actually could be a generic framework implemented in fit gui module.  At this 
     6point however there this grid behaves independently of the fitting panel and 
     7only knows about information sent to it but not about the fits or fit panel and 
     8thus cannot feed back to the fitting panel.  This could change in the future. 
     9 
     10The organization of the classes goes as: 
     11 
     12.. image::  ../../user/guiframe/BatchGridClassLayout.png 
     13   :align:   center 
     14 
    315""" 
    416import wx 
     
    2638    """ 
    2739    Object describing a cell in  the grid. 
    28  
    2940    """ 
    3041    def __init__(self): 
     42        """ 
     43        Initialize attributes of class (label, value, col, row, object) 
     44        """ 
    3145        self.label = "" 
    3246        self.value = None 
     
    3953    """ 
    4054    Return a dictionary of column label and index or row selected 
     55 
    4156    :param sentence: String to parse 
    4257    :param list: list of columns label 
     58    :returns: col_dict 
    4359    """ 
     60 
    4461    p2 = re.compile(r'\d+') 
    4562    p = re.compile(r'[\+\-\*\%\/]') 
     
    8198 
    8299class SPanel(ScrolledPanel): 
     100    """ 
     101    ensure proper scrolling of GridPanel  
     102     
     103    Adds a SetupScrolling call to the normal ScrolledPanel init.     
     104    GridPanel then subclasses this class 
     105     
     106    """ 
    83107    def __init__(self, parent, *args, **kwds): 
     108        """ 
     109        initialize ScrolledPanel then force a call to SetupScrolling 
     110 
     111        """ 
    84112        ScrolledPanel.__init__(self, parent, *args, **kwds) 
    85113        self.SetupScrolling() 
     
    87115 
    88116class GridCellEditor(sheet.CCellEditor): 
    89     """ Custom cell editor """ 
     117    """ 
     118    Custom cell editor 
     119 
     120    This subclasses the sheet.CCellEditor (itself a subclass of 
     121    grid.GridCellEditor) in order to override two of its methods: 
     122    PaintBackrgound and EndEdit. 
     123     
     124    This is necessary as the sheet module is broken in wx 3.0.2 and 
     125    improperly subclasses grid.GridCellEditor 
     126    """ 
    90127    def __init__(self, grid): 
     128        """ 
     129        Override of CCellEditor init. Runs the grid.GridCellEditor init code 
     130        """ 
    91131        super(GridCellEditor, self).__init__(grid) 
    92132 
     133    def PaintBackground(self, dc, rect, attr): 
     134        """ 
     135        Overrides wx.sheet.CCellEditor.PaintBackground which incorrectly calls 
     136        the base class method. 
     137 
     138        In wx3.0 all paint objects must explicitly 
     139        have a wxPaintDC (Device Context) object.  Thus the paint event which 
     140        generates a call to this method provides such a DC object and the 
     141        base class in grid expects to receive that object.  sheet was apparently 
     142        not updated to reflect this and hence fails.  This could thus 
     143        become obsolete in a future bug fix of wxPython. 
     144 
     145        Apart from adding a dc variable in the list of arguments in the def 
     146        and in the call to the base class the rest of this method is copied 
     147        as is from sheet.CCellEditor.PaintBackground 
     148 
     149        **From original GridCellEditor docs:** 
     150 
     151        Draws the part of the cell not occupied by the edit control.  The 
     152        base class version just fills it with background colour from the 
     153        attribute. 
     154 
     155        NOTE: There is no need to override this if you don't need 
     156        to do something out of the ordinary. 
     157 
     158        :param dc: the wxDC object for the paint 
     159        """ 
     160        # Call base class method. 
     161        DC = dc 
     162        super(sheet.CCellEditor,self).PaintBackground(DC, rect, attr) 
     163 
    93164    def EndEdit(self, row, col, grid, previous): 
    94         """  
    95             Commit editing the current cell. Returns True if the value has changed. 
    96             @param previous: previous value in the cell 
     165        """ 
     166        Commit editing the current cell. Returns True if the value has changed. 
     167 
     168        :param previous: previous value in the cell 
    97169        """ 
    98170        changed = False                             # Assume value not changed 
     
    108180class GridPage(sheet.CSheet): 
    109181    """ 
     182    Class that receives the results of a batch fit. 
     183 
     184    GridPage displays the received results in a wx.grid using sheet.  This is 
     185    then used by GridPanel and GridFrame to present the full GUI. 
    110186    """ 
    111187    def __init__(self, parent, panel=None): 
    112188        """ 
     189        Initialize 
     190 
     191        Initialize all the attributes of GridPage, and the events. include 
     192        the init stuff from sheet.CSheet as well. 
    113193        """ 
    114194        #sheet.CSheet.__init__(self, parent) 
    115          
     195 
    116196        # The following is the __init__ from CSheet. ########################## 
    117197        # We re-write it here because the class is broken in wx 3.0, 
     
    139219 
    140220        # Sink events 
     221        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.OnRangeSelect) 
     222        self.Bind(wx.grid.EVT_GRID_ROW_SIZE, self.OnRowSize) 
     223        self.Bind(wx.grid.EVT_GRID_COL_SIZE, self.OnColSize) 
     224        self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnGridSelectCell) 
     225        # NOTE: the following bind to standard sheet methods that are 
     226        # overriden in this subclassn - actually we have currently 
     227        # disabled the on_context_menu that would override the OnRightClick 
     228        self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnCellChange) 
    141229        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnLeftClick) 
    142230        self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnRightClick) 
    143231        #self.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, self.OnLeftDoubleClick) 
    144         self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.OnRangeSelect) 
    145         self.Bind(wx.grid.EVT_GRID_ROW_SIZE, self.OnRowSize) 
    146         self.Bind(wx.grid.EVT_GRID_COL_SIZE, self.OnColSize) 
    147         self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnCellChange) 
    148         self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnGridSelectCell) 
    149232        # This ends the __init__ section for CSheet. ########################## 
     233 
     234 
     235 
     236        # The following events must be bound even if CSheet is working  
     237        # properly and does not need the above re-implementation of the 
     238        # CSheet init method.  Basically these override any intrinsic binding 
     239        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_right_click) 
     240        self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.on_left_click) 
    150241 
    151242        self.AdjustScrollbars() 
     
    187278        if self.GetNumberCols() > 0: 
    188279            self.default_col_width = self.GetColSize(0) 
     280        # We have moved these to the top of the init section with the 
     281        # rest of the grid event bindings from the sheet init when 
     282        # appropriate 
    189283        #self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.on_left_click) 
    190284        #self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_right_click) 
     
    194288 
    195289    def OnLeftClick(self, event): 
     290        """ 
     291        Overrides sheet.CSheet.OnLefClick. 
     292 
     293        Processes when a cell is selected by left clicking on that cell. First 
     294        process the base Sheet method then the current class specific method 
     295        """ 
    196296        sheet.CSheet.OnLeftClick(self, event) 
    197297        self.on_selected_cell(event) 
    198          
    199     def on_edit_cell(self, event): 
    200         """ 
     298 
     299 
     300    def OnCellChange(self, event): 
     301        """ 
     302        Overrides sheet.CSheet.OnCellChange.   
     303 
     304        Processes when a cell has been edited by a cell editor. Checks for the 
     305        edited row being outside the max row to use attribute and if so updates 
     306        the last row.  Then calls the base handler using skip. 
    201307        """ 
    202308        row, _ = event.GetRow(), event.GetCol() 
     
    209315    def on_selected_cell(self, event): 
    210316        """ 
    211         Handler catching cell selection 
    212         """ 
     317        Handler catching cell selection. 
     318 
     319        Called after calling base 'on left click' method. 
     320        """ 
     321 
    213322        flag = event.CmdDown() or event.ControlDown() 
    214323        flag_shift = event.ShiftDown() 
     
    280389    def on_left_click(self, event): 
    281390        """ 
    282         Catch the left click on label mouse event 
    283         """ 
     391        Is triggered when the left mouse button is clicked while the mouse 
     392        is hovering over the column 'label.' 
     393 
     394        This processes the information on the selected column: the column name 
     395        (in row 0 of column) and the range of cells with a valid value to be 
     396        used by the GridPanel set_axis methods. 
     397        """ 
     398 
    284399        flag = event.CmdDown() or event.ControlDown() 
    285400 
     
    324439    def on_right_click(self, event): 
    325440        """ 
    326         Catch the right click mouse 
    327         """ 
     441        Is triggered when the right mouse button is clicked while the mouse 
     442        is hovering over the column 'label.' 
     443 
     444        This brings up a context menu that allows the deletion of the column, 
     445        or the insertion of a new column either to the right or left of the 
     446        current column.  If inserting a new column can insert a blank column or 
     447        choose a number of hidden columns.  By default all the error parameters 
     448        are in hidden columns so as to save space on the grid.  Also any other 
     449        intrinsic variables stored with the data such as Temperature, pressure, 
     450        time etc can be used to populate this menu. 
     451        """ 
     452 
    328453        col = event.GetCol() 
    329454        row = event.GetRow() 
     
    360485    def insert_col_menu(self, menu, label, window): 
    361486        """ 
    362         """ 
     487        method called to populate the 'insert column before current column' 
     488        submenu. 
     489        """ 
     490 
    363491        if self.data is None: 
    364492            return 
     
    380508    def insert_after_col_menu(self, menu, label, window): 
    381509        """ 
    382         """ 
     510        Method called to populate the 'insert column after current column' 
     511        submenu 
     512        """ 
     513 
    383514        if self.data is None: 
    384515            return 
     
    401532    def on_remove_column(self, event=None): 
    402533        """ 
    403         """ 
     534        Called when user chooses remove from the column right click menu 
     535        Checks the columnn exists then calls the remove_column method 
     536        """ 
     537 
    404538        if self.selected_cols is not None or len(self.selected_cols) > 0: 
    405539            col = self.selected_cols[0] 
     
    408542    def remove_column(self, col, numCols=1): 
    409543        """ 
    410         Remove column to the current grid 
    411         """ 
     544        Remove the col column from the current grid 
     545        """ 
     546 
    412547        # add data to the grid     
    413548        row = 0 
     
    429564    def on_insert_column(self, event): 
    430565        """ 
    431         """ 
     566        Called when user chooses insert 'column before' submenu 
     567        of the column context menu obtained when right clicking on a given 
     568        column header. 
     569 
     570        Sets up to insert column into the current grid before the current 
     571        highlighted column location and sets up what to populate that column 
     572        with.  Then calls insert_column method to actually do the insertion.  
     573        """ 
     574 
    432575        if self.selected_cols is not None or len(self.selected_cols) > 0: 
    433576            col = self.selected_cols[0] 
     
    442585    def on_insert_after_column(self, event): 
    443586        """ 
    444         Insert the given column after the highlighted column 
    445         """ 
     587        Called when user chooses insert 'column after' submenu 
     588        of the column context menu obtained when right clicking on a given 
     589        column header. 
     590 
     591        Sets up to insert column into the current grid after the current 
     592        highlighted column location and sets up what to populate that column 
     593        with.  Then calls insert_column method to actually do the insertion.  
     594        """ 
     595 
    446596        if self.selected_cols is not None or len(self.selected_cols) > 0: 
    447597            col = self.selected_cols[0] + 1 
     
    455605    def insert_column(self, col, col_name): 
    456606        """ 
    457         """ 
     607        Insert column at position col with data[col_name] into the current 
     608        grid. 
     609        """ 
     610 
    458611        row = 0 
    459612        self.InsertCols(pos=col, numCols=1, updateLabels=True) 
     
    477630    def on_set_x_axis(self, event): 
    478631        """ 
    479         """ 
     632        Just calls the panel version of the method 
     633        """ 
     634 
    480635        self.panel.set_xaxis(x=self.axis_value, label=self.axis_label) 
    481636 
    482637    def on_set_y_axis(self, event): 
    483638        """ 
    484         """ 
     639        Just calls the panel version of the method 
     640        """ 
     641 
    485642        self.panel.set_yaxis(y=self.axis_value, label=self.axis_label) 
    486643 
     
    488645        """ 
    489646        Add data to the grid 
     647 
    490648        :param data_inputs: data to use from the context menu of the grid 
    491         :param data_ouputs: default columns deplayed 
    492         """ 
     649        :param data_ouputs: default columns displayed 
     650        """ 
     651 
    493652        self.file_name = file_name 
    494653        self.details = details 
     
    527686        Set the values in grids 
    528687        """ 
     688 
    529689        # add data to the grid 
    530690        row = 0 
     
    562722        Return value contained in the grid 
    563723        """ 
     724 
    564725        grid_view = {} 
    565726        for col in xrange(self.GetNumberCols()): 
     
    584745    def onContextMenu(self, event): 
    585746        """ 
    586         Default context menu 
    587         """ 
     747        Method to handle cell right click context menu.  
     748 
     749        THIS METHOD IS NOT CURRENTLY USED.  It is designed to provide a 
     750        cell pop up context by right clicking on a cell and gives the 
     751        option to cut, paste, and clear. This will probably be removed in 
     752        future versions and is being superceded by more traditional cut and 
     753        paste options. 
     754        """ 
     755 
    588756        wx_id = wx.NewId() 
    589757        c_menu = wx.Menu() 
     
    620788    def on_copy(self, event): 
    621789        """ 
    622         On copy event from the contextmenu 
    623         """ 
     790        Called when copy is chosen from cell right click context menu 
     791 
     792        THIS METHOD IS NOT CURRENTLY USED.  it is part of right click cell 
     793        context menu which is being removed. This will probably be removed in 
     794        future versions and is being superceded by more traditional cut and 
     795        paste options 
     796        """ 
     797 
    624798        self.Copy() 
    625799 
    626800    def on_paste(self, event): 
    627801        """ 
    628         On paste event from the contextmenu 
    629         """ 
     802        Called when paste is chosen from cell right click context menu 
     803 
     804        THIS METHOD IS NOT CURRENTLY USED.  it is part of right click cell 
     805        context menu which is being removed. This will probably be removed in 
     806        future versions and is being superceded by more traditional cut and 
     807        paste options 
     808        """ 
     809 
    630810        if self.data == None: 
    631811            self.data = {} 
     
    636816    def on_clear(self, event): 
    637817        """ 
    638         Clear the cells selected 
    639         """ 
     818        Called when clear cell is chosen from cell right click context menu 
     819 
     820        THIS METHOD IS NOT CURRENTLY USED.  it is part of right click cell 
     821        context menu which is being removed. This will probably be removed in 
     822        future versions and is being superceded by more traditional cut and 
     823        paste options 
     824        """ 
     825 
    640826        self.Clear() 
    641827 
     
    646832    ## Title to appear on top of the window 
    647833    """ 
     834 
    648835    window_caption = "Notebook " 
    649836 
     
    682869    def enable_close_button(self): 
    683870        """ 
    684         display the close button on tab for more than 1 tabs else remove the 
    685         close button 
    686         """ 
     871        display the close button on the tab if more than 1 tab exits. 
     872        Otherwise remove the close button 
     873        """ 
     874 
    687875        if self.GetPageCount() <= 1: 
    688876            style = self.GetWindowStyleFlag() 
     
    700888    def on_edit_axis(self): 
    701889        """ 
    702         Return the select cell of a given selected column. Check that all cells 
    703         are from the same column 
    704         """ 
     890        Return the select cell range from a given selected column. Checks that 
     891        all cells are from the same column 
     892        """ 
     893 
    705894        pos = self.GetSelection() 
    706895        grid = self.GetPage(pos) 
     
    732921        Add highlight rows 
    733922        """ 
     923 
    734924        pos = self.GetSelection() 
    735925        grid = self.GetPage(pos) 
     
    759949    def get_column_labels(self): 
    760950        """ 
    761         return dictionary of columns labels of the current page 
    762         """ 
     951        return dictionary of columns labels on the current page 
     952        """ 
     953 
    763954        pos = self.GetSelection() 
    764955        grid = self.GetPage(pos) 
     
    773964        """ 
    774965        Receive a list of cells and  create a string presenting the selected 
    775         cells. 
     966        cells that can be used as data for one axis of a plot. 
     967 
    776968        :param cell_list: list of tuple 
    777  
    778969        """ 
    779970        pos = self.GetSelection() 
     
    8531044        close the page 
    8541045        """ 
     1046 
    8551047        if self.GetPageCount() == 1: 
    8561048            event.Veto() 
     
    8581050 
    8591051    def set_data(self, data_inputs, data_outputs, details="", file_name=None): 
     1052        """ 
     1053        """ 
    8601054        if data_outputs is None or data_outputs == {}: 
    8611055            return 
     
    8801074    def get_odered_results(self, inputs, outputs=None): 
    8811075        """ 
    882         Get ordered the results 
    883         """ 
     1076        Order a list of 'inputs.' Used to sort rows and columns to present 
     1077        in batch results grid. 
     1078        """ 
     1079 
    8841080        # Let's re-order the data from the keys in 'Data' name. 
    8851081        if outputs == None: 
     
    9141110        Append a new column to the grid 
    9151111        """ 
     1112 
     1113        # I Believe this is no longer used now that we have removed the  
     1114        # edit menu from the menubar - PDB July 12, 2015 
    9161115        pos = self.GetSelection() 
    9171116        grid = self.GetPage(pos) 
     
    9221121        Remove the selected column from the grid 
    9231122        """ 
     1123        # I Believe this is no longer used now that we have removed the  
     1124        # edit menu from the menubar - PDB July 12, 2015 
    9241125        pos = self.GetSelection() 
    9251126        grid = self.GetPage(pos) 
     
    9271128 
    9281129class GridPanel(SPanel): 
     1130    """ 
     1131    A ScrolledPanel class that contains the grid sheet as well as a number of 
     1132    widgets to create interesting plots and buttons for help etc. 
     1133    """ 
     1134 
    9291135    def __init__(self, parent, data_inputs=None, 
    9301136                 data_outputs=None, *args, **kwds): 
     1137        """ 
     1138        Initialize the GridPanel 
     1139        """ 
     1140 
    9311141        SPanel.__init__(self, parent, *args, **kwds) 
    9321142 
     
    9901200    def get_plot_axis(self, col, list): 
    9911201        """ 
    992  
    9931202        """ 
    9941203        axis = [] 
     
    10151224    def on_view(self, event): 
    10161225        """ 
    1017         Get object represented buy the given cell and plot them. 
    1018         """ 
     1226        Get object represented by the given cells and plot them.  Basically 
     1227        plot the colum in y vs the column in x. 
     1228        """ 
     1229 
    10191230        pos = self.notebook.GetSelection() 
    10201231        grid = self.notebook.GetPage(pos) 
     
    10961307        Evaluate the contains of textcrtl and plot result 
    10971308        """ 
     1309 
    10981310        pos = self.notebook.GetSelection() 
    10991311        grid = self.notebook.GetPage(pos) 
     
    12031415        running "file:///...." 
    12041416 
    1205     :param evt: Triggers on clicking the help button 
    1206     """ 
     1417        :param evt: Triggers on clicking the help button 
     1418        """ 
     1419 
    12071420        #import documentation window here to avoid circular imports 
    12081421        #if put at top of file with rest of imports. 
     
    12181431        Get sentence from dict 
    12191432        """ 
     1433 
    12201434        for tok, (col_name, list) in dict.iteritems(): 
    12211435            col = column_names[col_name] 
     
    12301444    def layout_grid(self): 
    12311445        """ 
    1232         Draw the area related to the grid 
    1233         """ 
     1446        Draw the area related to the grid by adding it as the first element 
     1447        in the panel's grid_sizer 
     1448        """ 
     1449 
    12341450        self.notebook = Notebook(parent=self) 
    12351451        self.notebook.set_data(self._data_inputs, self._data_outputs) 
     
    12381454    def layout_plotting_area(self): 
    12391455        """ 
    1240         Draw area containing options to plot 
    1241         """ 
     1456        Add the area containing all the plot options, buttons etc to a plotting 
     1457        area sizer to later be added to the top level grid_sizer 
     1458        """ 
     1459 
    12421460        view_description = wx.StaticBox(self, -1, 'Plot Fits/Residuals') 
    12431461        note = "To plot the fits (or residuals), click the 'View Fits' button" 
     
    12811499                                   (self.plot_button, 0, 
    12821500                                    wx.LEFT | wx.TOP | wx.BOTTOM, 12), 
    1283                                    (self.help_button,0,  
     1501                                   (self.help_button,0, 
    12841502                                    wx.LEFT | wx.TOP | wx.BOTTOM, 12)]) 
    12851503 
     
    13161534        Get the selected column on  the visible grid and set values for axis 
    13171535        """ 
     1536 
    13181537        try: 
    13191538            cell_list = self.notebook.on_edit_axis() 
     
    13351554        Receive a list of cells and  create a string presenting the selected 
    13361555        cells. 
     1556 
    13371557        :param cell_list: list of tuple 
    1338  
    1339         """ 
     1558        """ 
     1559 
    13401560        if self.notebook is not None: 
    13411561            return self.notebook.create_axis_label(cell_list) 
     
    13451565        get controls to modify 
    13461566        """ 
     1567 
    13471568        if label != None: 
    13481569            tcrtl_label.SetValue(str(label)) 
     
    13531574        """ 
    13541575        """ 
     1576        # I Believe this is no longer used now that we have removed the 
     1577        # edit menu from the menubar - PDB July 12, 2015 
    13551578        if self.notebook is not None: 
    13561579            self.notebook.add_column() 
     
    13591582        """ 
    13601583        """ 
     1584        # I Believe this is no longer used now that we have removed the 
     1585        # edit menu from the menubar - PDB July 12, 2015 
    13611586        if self.notebook is not None: 
    13621587            self.notebook.on_remove_column() 
     
    13641589 
    13651590class GridFrame(wx.Frame): 
     1591    """ 
     1592    The main wx.Frame for the batch results grid 
     1593    """ 
     1594 
    13661595    def __init__(self, parent=None, data_inputs=None, data_outputs=None, id=-1, 
    1367                  title="Grid Window", size=(800, 500)): 
     1596                 title="Batch Fitting Results Panel", size=(800, 500)): 
     1597        """ 
     1598        Initialize the Frame 
     1599        """ 
     1600 
    13681601        wx.Frame.__init__(self, parent=parent, id=id, title=title, size=size) 
    13691602        self.parent = parent 
     
    13891622        wx.EVT_MENU(self, self.save_menu.GetId(), self.on_save_page) 
    13901623 
    1391         # To add the edit menu, call add_edit_menu() here. 
    1392         self.edit = None 
     1624        # We need to grab a WxMenu handle here, otherwise the next one to grab 
     1625        # the handle will be treated as the Edit Menu handle when checking in 
     1626        # on_menu_open event handler and thus raise an exception when it hits an  
     1627        # unitialized object.  Alternative is to comment out that whole section 
     1628        # in on_menu_open, but that would make it more difficult to undo the 
     1629        # hidding of the menu.   PDB  July 12, 2015. 
     1630        # 
     1631        # To enable the Edit menubar comment out next line and uncomment the 
     1632        # following line. 
     1633        self.edit = wx.Menu() 
     1634        #self.add_edit_menu() 
     1635 
    13931636        self.Bind(wx.EVT_MENU_OPEN, self.on_menu_open) 
    1394          
    13951637        self.Bind(wx.EVT_CLOSE, self.on_close) 
    13961638 
    13971639    def add_edit_menu(self, menubar): 
     1640        """ 
     1641        populates the edit menu on the menubar.  Not activated as of SasView 
     1642        3.1.0 
     1643        """ 
    13981644        self.edit = wx.Menu() 
    13991645 
     
    14291675    def on_copy(self, event): 
    14301676        """ 
    1431         On Copy 
    1432         """ 
     1677        On Copy from the Edit menu item on the menubar 
     1678        """ 
     1679        # I Believe this is no longer used now that we have removed the  
     1680        # edit menu from the menubar - PDB July 12, 2015 
    14331681        if event != None: 
    14341682            event.Skip() 
     
    14391687    def on_paste(self, event): 
    14401688        """ 
    1441         On Paste 
    1442         """ 
     1689        On Paste from the Edit menu item on the menubar 
     1690        """ 
     1691        # I Believe this is no longer used now that we have removed the  
     1692        # edit menu from the menubar - PDB July 12, 2015 
    14431693        if event != None: 
    14441694            event.Skip() 
     
    14491699    def on_clear(self, event): 
    14501700        """ 
    1451         On Clear 
    1452         """ 
     1701        On Clear from the Edit menu item on the menubar 
     1702        """ 
     1703        # I Believe this is no longer used now that we have removed the  
     1704        # edit menu from the menubar - PDB July 12, 2015 
    14531705        pos = self.panel.notebook.GetSelection() 
    14541706        grid = self.panel.notebook.GetPage(pos) 
     
    14661718    def on_remove_column(self, event): 
    14671719        """ 
    1468         On remove column 
    1469         """ 
     1720        On remove column from the Edit menu Item on the menubar 
     1721        """ 
     1722        # I Believe this is no longer used now that we have removed the  
     1723        # edit menu from the menubar - PDB July 12, 2015 
    14701724        pos = self.panel.notebook.GetSelection() 
    14711725        grid = self.panel.notebook.GetPage(pos) 
     
    15351789    def on_save_page(self, event): 
    15361790        """ 
    1537         """ 
     1791        Saves data in grid to a csv file. 
     1792 
     1793        At this time only the columns displayed get saved.  Thus any error 
     1794        bars not inserted before saving will not be saved in the file 
     1795        """ 
     1796 
    15381797        if self.parent is not None: 
    15391798            pos = self.panel.notebook.GetSelection() 
     
    15661825    def on_open(self, event): 
    15671826        """ 
    1568         Open file containg batch result 
    1569         """ 
     1827        Open file containing batch result 
     1828        """ 
     1829 
    15701830        if self.parent is not None: 
    15711831            self.parent.on_read_batch_tofile(self) 
     
    15751835        open excel and display batch result in Excel 
    15761836        """ 
     1837 
    15771838        if self.parent is not None: 
    15781839            pos = self.panel.notebook.GetSelection() 
     
    16251886                 details="", *args, **kwds): 
    16261887        """ 
     1888        Initialize dialog 
     1889 
    16271890        :param parent: Window instantiating this dialog 
    1628         :param result: result to display in a grid or export to an external 
     1891        :param result: result to display in a grid or export to an external\ 
    16291892                application. 
    16301893        """ 
     1894 
    16311895        #kwds['style'] = wx.CAPTION|wx.SYSTEM_MENU 
    16321896        wx.Frame.__init__(self, parent, *args, **kwds) 
     
    16511915        Draw the content of the current dialog window 
    16521916        """ 
     1917 
    16531918        vbox = wx.BoxSizer(wx.VERTICAL) 
    16541919        box_description = wx.StaticBox(self.panel, -1, str("Batch Outputs")) 
     
    17041969        Get the user selection and display output to the selected application 
    17051970        """ 
     1971 
    17061972        if self.flag == 1: 
    17071973            self.parent.open_with_localapp(data_inputs=self.data_inputs, 
     
    17151981        close the Window 
    17161982        """ 
     1983 
    17171984        self.Close() 
    17181985 
     
    17211988        Receive event and display data into third party application 
    17221989        or save data to file. 
    1723  
    17241990        """ 
    17251991        if self.save_to_file.GetValue(): 
  • src/sas/guiframe/documentation_window.py

    r7a508b6 rfb3f9af  
    4343    (self, parent, dummy_id, path, url_instruction, title, size=(850, 540)) 
    4444 
    45     :param path: path to html file beginning AFTER /doc/ and ending in the 
    46     file.html 
    47     :param url_instructions: anchor string or other query e.g. '#MyAnchor 
    48     :param title - text to place in the title bar of the help panel 
     45    :param path: path to html file beginning AFTER /doc/ and ending in the\ 
     46    file.html. 
     47    :param url_instructions: anchor string or other query e.g. '#MyAnchor' 
     48    :param title: text to place in the title bar of the help panel 
    4949    """ 
    5050    def __init__(self, parent, dummy_id, path, url_instruction, title, size=(850, 540)): 
  • src/sas/guiframe/local_perspectives/plotting/Plotter1D.py

    rb99a4552 r098f3d2  
    564564            self._slicerpop.Append(wx_id, '&Print Image', 'Print image ') 
    565565            wx.EVT_MENU(self, wx_id, self.onPrint) 
    566             wx_id = wx.NewId() 
    567             self._slicerpop.Append(wx_id, '&Print Preview', 'Print preview') 
    568             wx.EVT_MENU(self, wx_id, self.onPrinterPreview) 
    569566 
    570567            wx_id = wx.NewId() 
  • src/sas/guiframe/local_perspectives/plotting/Plotter2D.py

    rc039589 r098f3d2  
    300300 
    301301        wx_id = wx.NewId() 
    302         slicerpop.Append(wx_id, '&Print Preview', 'Print preview') 
    303         wx.EVT_MENU(self, wx_id, self.onPrinterPreview) 
    304  
    305         wx_id = wx.NewId() 
    306302        slicerpop.Append(wx_id, '&Copy to Clipboard', 'Copy to the clipboard') 
    307303        wx.EVT_MENU(self, wx_id, self.OnCopyFigureMenu) 
  • src/sas/guiframe/local_perspectives/plotting/SimplePlot.py

    rb40ad40 r098f3d2  
    5858        slicerpop.Append(wx_id, '&Print Image', 'Print image') 
    5959        wx.EVT_MENU(self, wx_id, self.onPrint) 
    60  
    61         wx_id = wx.NewId() 
    62         slicerpop.Append(wx_id, '&Print Preview', 'Print preview') 
    63         wx.EVT_MENU(self, wx_id, self.onPrinterPreview) 
    6460 
    6561        wx_id = wx.NewId() 
     
    234230        wx.EVT_MENU(self, id, self.on_print_image) 
    235231 
    236         id = wx.NewId() 
    237         item = wx.MenuItem(menu, id, "&Print Preview") 
    238         item.SetBitmap(preview_bmp) 
    239         menu.AppendItem(item) 
    240         wx.EVT_MENU(self, id, self.on_print_preview) 
    241  
    242232        menu.AppendSeparator() 
    243233        id = wx.NewId() 
  • src/sas/guiframe/report_dialog.py

    re8bb5b6 r098f3d2  
    6666        hbox.Add(button_close) 
    6767        button_close.SetFocus() 
    68  
    69         button_preview = wx.Button(self, wx.NewId(), "Preview") 
    70         button_preview.SetToolTipString("Print preview this report.") 
    71         button_preview.Bind(wx.EVT_BUTTON, self.onPreview, 
    72                             id=button_preview.GetId())  
    73         hbox.Add(button_preview) 
    7468 
    7569        button_print = wx.Button(self, wx.NewId(), "Print") 
  • src/sas/models/CoreMultiShellModel.py

    rac7be54 re0c16ce  
    5353        ## parameters with orientation: can be removed since there is no orientational params 
    5454        self._set_orientation_params() 
    55                  
    56          
     55 
    5756    def _clone(self, obj): 
    5857        """ 
     
    6766 
    6867        return obj 
    69      
    70      
     68 
    7169    def _set_dispersion(self): 
    7270        """ 
    7371        model dispersions 
    7472        Polydispersion should not be applied to s_model 
    75         """  
    76         ##set dispersion from model  
     73        """ 
     74        ##set dispersion from model 
    7775        for name , value in self.model.dispersion.iteritems():       
    7876            nshell = 0 
     
    8280                    if name.split('_')[-1] == 'shell%s' % str(nshell): 
    8381                        self.dispersion[name] = value 
    84                     else:  
     82                    else: 
    8583                        continue 
    8684            else: 
    8785                self.dispersion[name] = value 
    88                  
     86 
    8987    def _set_orientation_params(self): 
    9088        """ 
    9189        model orientation and magnetic parameters, same params for this model 
    92         """  
     90        """ 
    9391        ##set dispersion from model  
    9492        for param in self.model.orientation_params:      
     
    104102                    self.orientation_params.append(param) 
    105103                    self.magnetic_params.append(param) 
    106                     continue                            
     104                    continue 
    107105 
    108106    def _set_params(self): 
    109107        """ 
    110108        Concatenate the parameters of the model to create 
    111         this model parameters  
     109        this model parameters 
    112110        """ 
    113111        # rearrange the parameters for the given # of shells 
     
    128126            else: 
    129127                self.params[name]= value 
    130              
     128 
    131129        # set constrained values for the original model params 
    132         self._set_xtra_model_param()        
    133    
     130        self._set_xtra_model_param() 
     131 
    134132    def _set_details(self): 
    135133        """ 
    136134        Concatenate details of the original model to create 
    137         this model details  
     135        this model details 
    138136        """ 
    139137        for name ,detail in self.model.details.iteritems(): 
    140138            if name in self.params.iterkeys(): 
    141139                self.details[name]= detail 
    142              
    143      
     140 
     141 
    144142    def _set_xtra_model_param(self): 
    145143        """ 
     
    163161                                self.model.setParam(key, 0.0) 
    164162                        except: pass 
    165                       
     163 
    166164 
    167165    def getProfile(self): 
    168166        """ 
    169         Get SLD profile  
    170          
    171         : return: (r, beta) where r is a list of radius of the transition points 
    172             beta is a list of the corresponding SLD values 
    173         : Note: This works only for func_shell num = 2. 
     167        Get SLD profile 
     168        **Note:** This works only for func_shell num = 2. 
     169 
     170        :return: (r, beta) where r is a list of radius of the transition points\ 
     171         and beta is a list of the corresponding SLD values. 
    174172        """ 
    175173        r = [] 
     
    181179        r.append(self.params['rad_core0']) 
    182180        beta.append(self.params['sld_core0']) 
    183          
     181 
    184182        # for shells 
    185183        for n in range(1, self.n_shells+1): 
    186184            # Left side of each shells 
    187             r0 = r[len(r)-1]             
     185            r0 = r[len(r)-1] 
    188186            r.append(r0) 
    189187            exec "beta.append(self.params['sld_shell%s'% str(n)])" 
     
    193191            r.append(r0) 
    194192            exec "beta.append(self.params['sld_shell%s'% str(n)])" 
    195              
     193 
    196194        # for solvent 
    197195        r0 = r[len(r)-1]             
     
    201199        r.append(r_solv) 
    202200        beta.append(self.params['sld_solv']) 
    203          
     201 
    204202        return r, beta 
    205203 
    206204    def setParam(self, name, value): 
    207         """  
     205        """ 
    208206        Set the value of a model parameter 
    209      
    210         : param name: name of the parameter 
    211         : param value: value of the parameter 
     207 
     208        :param name: name of the parameter 
     209        :param value: value of the parameter 
    212210        """ 
    213211        # set param to new model 
    214212        self._setParamHelper( name, value) 
    215         ## setParam to model  
     213        ## setParam to model 
    216214        if name == 'sld_solv': 
    217215            # the sld_*** model.params not in params must set to value of sld_solv 
     
    243241                self.params[item] = value 
    244242                return 
    245          
    246243        #raise ValueError, "Model does not contain parameter %s" % name 
    247               
    248     
     244 
     245 
    249246    def _set_fixed_params(self): 
    250247        """ 
     
    252249        """ 
    253250        for item in self.model.fixed: 
    254             if item.split('.')[0] in self.params.keys():  
     251            if item.split('.')[0] in self.params.keys(): 
    255252                self.fixed.append(item) 
    256253 
    257254        self.fixed.sort() 
    258                  
     255 
    259256    def run(self, x = 0.0): 
    260         """  
     257        """ 
    261258        Evaluate the model 
    262          
    263         : param x: input q-value (float or [float, float] as [r, theta]) 
    264         : return: (DAB value) 
     259 
     260        :param x: input q-value (float or [float, float] as [r, theta]) 
     261        :return: (DAB value) 
    265262        """ 
    266263        # set effective radius and scaling factor before run 
     
    269266 
    270267    def runXY(self, x = 0.0): 
    271         """  
     268        """ 
    272269        Evaluate the model 
    273          
    274         : param x: input q-value (float or [float, float] as [qx, qy]) 
    275         : return: DAB value 
     270 
     271        :param x: input q-value (float or [float, float] as [qx, qy]) 
     272        :return: DAB value 
    276273        """   
    277274        # set effective radius and scaling factor before run 
    278275 
    279276        return self.model.runXY(x) 
    280      
     277 
    281278    ## Now (May27,10) directly uses the model eval function  
    282279    ## instead of the for-loop in Base Component. 
    283280    def evalDistribution(self, x = []): 
    284         """  
     281        """ 
    285282        Evaluate the model in cartesian coordinates 
    286          
    287         : param x: input q[], or [qx[], qy[]] 
    288         : return: scattering function P(q[]) 
     283 
     284        :param x: input q[], or [qx[], qy[]] 
     285        :return: scattering function P(q[]) 
    289286        """ 
    290287        # set effective radius and scaling factor before run 
    291288        return self.model.evalDistribution(x) 
    292      
     289 
    293290    def calculate_ER(self): 
    294         """  
     291        """ 
    295292        Calculate the effective radius for P(q)*S(q) 
    296          
     293 
    297294        :return: the value of the effective radius 
    298          
    299         """        
     295        """ 
    300296        return self.model.calculate_ER()  
    301      
     297 
    302298    def calculate_VR(self): 
    303         """  
     299        """ 
    304300        Calculate the volf ratio for P(q)*S(q) 
    305          
     301 
    306302        :return: the value of the volf ratio 
    307          
    308         """        
     303        """ 
    309304        return self.model.calculate_VR() 
    310      
     305 
    311306    def set_dispersion(self, parameter, dispersion): 
    312307        """ 
    313308        Set the dispersion object for a model parameter 
    314          
    315         : param parameter: name of the parameter [string] 
    316         :dispersion: dispersion object of type DispersionModel 
     309 
     310        :param parameter: name of the parameter [string] 
     311        :param dispersion: dispersion object of type DispersionModel 
    317312        """ 
    318313        value = None 
     
    323318            return value 
    324319        except: 
    325             raise  
     320            raise 
  • src/sas/models/MultiplicationModel.py

    rac7be54 rfb3f9af  
    1010        which will be calculated from P(Q) via calculate_ER(),  
    1111        and 2) 'scale' in P model which is synchronized w/ volfraction in S  
    12         then P*S is multiplied by a new param, 'scale_factor'. 
     12        then P*S is multiplied by a new parameter, 'scale_factor'. 
    1313        The polydispersion is applicable only to P(Q), not to S(Q). 
    14         Note: P(Q) refers to 'form factor' model while S(Q) does to 'structure factor'. 
     14 
     15        .. note:: P(Q) refers to 'form factor' model while S(Q) does to 'structure factor'. 
    1516    """ 
    1617    def __init__(self, p_model, s_model ): 
     
    8182    def _clone(self, obj): 
    8283        """ 
    83             Internal utility function to copy the internal 
    84             data members to a fresh copy. 
     84        Internal utility function to copy the internal data members to a 
     85        fresh copy. 
    8586        """ 
    8687        obj.params     = copy.deepcopy(self.params) 
     
    9697    def _set_dispersion(self): 
    9798        """ 
    98            combined the two models dispersions 
    99            Polydispersion should not be applied to s_model 
     99        combine the two models' dispersions. Polydispersity should not be 
     100        applied to s_model 
    100101        """ 
    101102        ##set dispersion only from p_model  
     
    107108        Get SLD profile of p_model if exists 
    108109         
    109         : return: (r, beta) where r is a list of radius of the transition points 
    110                 beta is a list of the corresponding SLD values  
    111         : Note: This works only for func_shell num = 2 (exp function). 
     110        :return: (r, beta) where r is a list of radius of the transition points\ 
     111                beta is a list of the corresponding SLD values 
     112 
     113        .. note:: This works only for func_shell num = 2 (exp function). 
    112114        """ 
    113115        try: 
     
    121123    def _set_params(self): 
    122124        """ 
    123             Concatenate the parameters of the two models to create 
    124             this model parameters  
     125        Concatenate the parameters of the two models to create 
     126        these model parameters  
    125127        """ 
    126128 
     
    141143    def _set_details(self): 
    142144        """ 
    143             Concatenate details of the two models to create 
    144             this model details  
     145        Concatenate details of the two models to create 
     146        this model's details  
    145147        """ 
    146148        for name, detail in self.p_model.details.iteritems(): 
     
    154156    def _set_scale_factor(self): 
    155157        """ 
    156             Set scale=volfraction to P model 
     158        Set scale=volfraction for P model 
    157159        """ 
    158160        value = self.params['volfraction'] 
     
    168170    def _set_effect_radius(self): 
    169171        """ 
    170             Set effective radius to S(Q) model 
     172        Set effective radius to S(Q) model 
    171173        """ 
    172174        if not 'effect_radius' in self.s_model.params.keys(): 
     
    206208    def _setParamHelper(self, name, value): 
    207209        """ 
    208             Helper function to setparam 
     210        Helper function to setparam 
    209211        """ 
    210212        # Look for dispersion parameters 
     
    229231    def _set_fixed_params(self): 
    230232        """ 
    231              fill the self.fixed list with the p_model fixed list 
     233        Fill the self.fixed list with the p_model fixed list 
    232234        """ 
    233235        for item in self.p_model.fixed: 
     
    240242        """  
    241243        Evaluate the model 
     244         
    242245        :param x: input q-value (float or [float, float] as [r, theta]) 
    243246        :return: (scattering function value) 
     
    250253 
    251254    def runXY(self, x = 0.0): 
    252         """ Evaluate the model 
    253             @param x: input q-value (float or [float, float] as [qx, qy]) 
    254             @return: scattering function value 
     255        """  
     256        Evaluate the model 
     257         
     258        :param x: input q-value (float or [float, float] as [qx, qy]) 
     259        :return: scattering function value 
    255260        """   
    256261        # set effective radius and scaling factor before run 
     
    266271        """  
    267272        Evaluate the model in cartesian coordinates 
     273         
    268274        :param x: input q[], or [qx[], qy[]] 
    269275        :return: scattering function P(q[]) 
     
    279285        """ 
    280286        Set the dispersion object for a model parameter 
     287         
    281288        :param parameter: name of the parameter [string] 
    282289        :dispersion: dispersion object of type DispersionModel 
     
    293300    def fill_description(self, p_model, s_model): 
    294301        """ 
    295             Fill the description for P(Q)*S(Q) 
     302        Fill the description for P(Q)*S(Q) 
    296303        """ 
    297304        description = "" 
  • src/sas/models/c_extension/c_models/GelFit.cpp

    r79492222 r1d115ef  
    3434    radius = Parameter(104.0,true); 
    3535    radius.set_min(2.0); 
    36     scale = Parameter(2.0,true); 
     36    FractalExp = Parameter(2.0,true); 
    3737    background = Parameter(0.01); 
    3838} 
     
    4343    dp[0] = zeta(); 
    4444    dp[1] = radius(); 
    45     dp[2] = scale(); 
     45    dp[2] = FractalExp(); 
    4646     
    4747    if (dp[2] <= 0) 
  • src/sas/models/c_extension/python_wrapper/WrapperGenerator.py

    r13e46abe r1f5f206  
    560560    def replaceToken(self, line, key, value): #pylint: disable-msg=R0201 
    561561        """ Replace a token in the template file  
    562             @param line: line of text to inspect 
    563             @param key: token to look for 
    564             @param value: string value to replace the token with 
    565             @return: new string value 
     562            :param line: line of text to inspect 
     563            :param key: token to look for 
     564            :param value: string value to replace the token with 
     565            :return: new string value 
    566566        """ 
     567        _str_value = str(value) 
     568        _new_value = _str_value.replace('\\','/') 
    567569        lenkey = len(key) 
    568570        newline = line 
     
    570572        while newline.count(key) > 0: 
    571573            index = newline.index(key) 
    572             newline = newline[:index] + value + newline[index + lenkey:] 
     574            newline = newline[:index] + _new_value + newline[index + lenkey:] 
    573575 
    574576        return newline 
  • src/sas/models/c_extension/python_wrapper/modelTemplate.txt

    rc93122e r1f5f206  
    1717 
    1818.. WARNING:: 
    19  
    2019   THIS FILE WAS GENERATED BY WRAPPERGENERATOR.PY 
    2120   DO NOT MODIFY THIS FILE, MODIFY 
     
    3029def create_[PYTHONCLASS](): 
    3130    """ 
    32        Create a model instance 
     31    Create a model instance 
    3332    """ 
    3433    obj = [PYTHONCLASS]() 
     
    10099        """ 
    101100        Evaluate the model 
     101 
    102102        :param x: input q, or [q,phi] 
    103103        :return: scattering function P(q) 
     
    108108        """ 
    109109        Evaluate the model in cartesian coordinates 
     110 
    110111        :param x: input q, or [qx, qy] 
    111112        :return: scattering function P(q) 
     
    116117        """ 
    117118        Evaluate the model in cartesian coordinates 
     119 
    118120        :param x: input q[], or [qx[], qy[]] 
    119121        :return: scattering function P(q[]) 
     
    124126        """ 
    125127        Calculate the effective radius for P(q)*S(q) 
     128 
    126129        :return: the value of the effective radius 
    127130        """ 
     
    131134        """ 
    132135        Calculate the volf ratio for P(q)*S(q) 
     136 
    133137        :return: the value of the volf ratio 
    134138        """ 
     
    138142        """ 
    139143        Set the dispersion object for a model parameter 
     144 
    140145        :param parameter: name of the parameter [string] 
    141146        :param dispersion: dispersion object of type DispersionModel 
  • src/sas/models/include/GelFit.h

    r79492222 r1d115ef  
    3333  Parameter radius; 
    3434 
    35   //  [DEFAULT]=scale= 2 
    36   Parameter scale; 
     35  //  [DEFAULT]=FractalExp= 2 
     36  Parameter FractalExp; 
    3737 
    3838  //  [DEFAULT]=background= 0.01 
  • src/sas/models/include/dabmodel.h

    r79492222 rf008ee2  
    1717// [PYTHONCLASS] = DABModel 
    1818// [DISP_PARAMS] = length, scale, background 
    19 // [DESCRIPTION] = <text>Provide F(x) = scale/( 1 + (x*L)^2 )^(2) + background 
    20 //    DAB (Debye Anderson Brumberger) function as a BaseComponent model 
     19// [DESCRIPTION] = <text>DAB (Debye Anderson Brumberger) Model 
     20//    F(x) = scale * L^3/( 1 + (q*L)^2 )^2 + background 
     21//    L: the correlation length 
    2122//     </text> 
    2223// [FIXED] =  
  • src/sas/models/sas_extension/__init__.py

    r79492222 rfb3f9af  
     1""" 
     2This is an empty package - should probably delete 
     3""" 
  • src/sas/perspectives/fitting/resultpanel.py

    r2f4b430 r9df6a03  
    99import wx.lib.newevent 
    1010from wx.aui import AuiNotebook as Notebook 
     11 
     12from bumps.gui.convergence_view import ConvergenceView 
     13from bumps.gui.uncertainty_view import UncertaintyView, CorrelationView, TraceView 
     14from bumps.dream.stats import var_stats, format_vars 
    1115 
    1216from sas.guiframe.panel_base import PanelBase 
     
    5559        result = event.result[0][0] 
    5660        if hasattr(result, 'convergence'): 
    57             from bumps.gui.convergence_view import ConvergenceView 
    5861            best, pop = result.convergence[:, 0], result.convergence[:, 1:] 
    59             self.get_panel(ConvergenceView).update(best, pop) 
     62            self._get_view(ConvergenceView).update(best, pop) 
     63        else: 
     64            self._del_view(ConvergenceView) 
    6065        if hasattr(result, 'uncertainty_state'): 
    61             from bumps.gui.uncertainty_view import UncertaintyView, CorrelationView, TraceView 
    62             from bumps.dream.stats import var_stats, format_vars 
    6366            stats = var_stats(result.uncertainty_state.draw()) 
    6467            msg = format_vars(stats) 
    65             self.get_panel(CorrelationView).update(result.uncertainty_state) 
    66             self.get_panel(UncertaintyView).update((result.uncertainty_state, stats)) 
    67             self.get_panel(TraceView).update(result.uncertainty_state) 
     68            self._get_view(CorrelationView).update(result.uncertainty_state) 
     69            self._get_view(UncertaintyView).update((result.uncertainty_state, stats)) 
     70            self._get_view(TraceView).update(result.uncertainty_state) 
    6871            # TODO: stats should be stored in result rather than computed in bumps UncertaintyView 
    6972            wx.PostEvent(self.frame.parent, 
    7073                         StatusEvent(status=msg, info="info")) 
    71             print 
     74        else: 
     75            for view in (CorrelationView, UncertaintyView, TraceView): 
     76                self._del_view(view) 
    7277 
    7378    def get_frame(self): 
    7479        return self.frame 
    7580 
    76     def add_panel(self, panel): 
    77         self.AddPage(panel, panel.title) 
    78  
    79     def get_panel(self, panel_class): 
     81    def _get_view(self, view_class): 
    8082        for idx in range(self.PageCount): 
    81             if self.GetPageText(idx) == panel_class.title: 
     83            if self.GetPageText(idx) == view_class.title: 
    8284                return self.GetPage(idx) 
    8385        else: 
    84             panel = panel_class(self) 
    85             self.add_panel(panel) 
     86            panel = view_class(self) 
     87            self.AddPage(panel, panel.title) 
    8688            return panel 
     89 
     90    def _del_view(self, view_class): 
     91        for idx in range(self.PageCount): 
     92            if self.GetPageText(idx) == view_class.title: 
     93                self.DeletePage(idx) 
     94 
  • src/sas/plottools/PlotPanel.py

    r7e0f9b5 rd3d67f0  
    33""" 
    44import logging 
     5import traceback 
    56import wx 
    67# Try a normal import first 
     
    2122 
    2223from plottables import Graph 
    23 from plottables import Text 
    2424from TextDialog import TextDialog 
    2525from LabelDialog import LabelDialog 
     
    3232import numpy 
    3333 
    34 from sas.guiframe.events import StatusEvent 
     34from ..guiframe.events import StatusEvent 
     35from .toolbar import NavigationToolBar, PlotPrintout, bind 
    3536 
    3637def show_tree(obj, d=0): 
     
    8889            lo, hi = math.pow(10., lo), math.pow(10., hi) 
    8990    return (lo, hi) 
    90  
    91  
    92 def CopyImage(canvas): 
    93     """ 
    94     0: matplotlib plot 
    95     1: wx.lib.plot 
    96     2: other 
    97     """ 
    98     bmp = wx.BitmapDataObject() 
    99     bmp.SetBitmap(canvas.bitmap) 
    100  
    101     wx.TheClipboard.Open() 
    102     wx.TheClipboard.SetData(bmp) 
    103     wx.TheClipboard.Close() 
    10491 
    10592 
     
    333320        """ 
    334321        self.enable_toolbar = True 
    335         from toolbar import NavigationToolBar 
    336322        self.toolbar = NavigationToolBar(parent=self, canvas=self.canvas) 
     323        bind(self.toolbar, wx.EVT_TOOL, self.onResetGraph, id=self.toolbar._NTB2_RESET) 
     324        bind(self.toolbar, wx.EVT_TOOL, self.onContextMenu, id=self.toolbar._NTB2_HOME) 
    337325        self.toolbar.Realize() 
    338326        ## The 'SetToolBar()' is not working on MAC: JHC 
     
    634622        when clicking on linear Fit on context menu , display Fitting Dialog 
    635623        """ 
    636         list = {} 
     624        plot_dict = {} 
    637625        menu = event.GetEventObject() 
    638         id = event.GetId() 
    639         self.set_selected_from_menu(menu, id) 
     626        event_id = event.GetId() 
     627        self.set_selected_from_menu(menu, event_id) 
    640628        plotlist = self.graph.returnPlottable() 
    641629        if self.graph.selected_plottable is not None: 
    642630            for item in plotlist: 
    643631                if item.id == self.graph.selected_plottable: 
    644                     list[item] = plotlist[item] 
     632                    plot_dict[item] = plotlist[item] 
    645633        else: 
    646             list = plotlist 
     634            plot_dict = plotlist 
    647635        from fitDialog import LinearFit 
    648636 
    649         if len(list.keys()) > 0: 
    650             first_item = list.keys()[0] 
     637        if len(plot_dict.keys()) > 0: 
     638            first_item = plot_dict.keys()[0] 
    651639            dlg = LinearFit(parent=None, plottable=first_item, 
    652640                            push_data=self.onFitDisplay, 
     
    862850        Implement save image 
    863851        """ 
    864         self.toolbar.save(evt) 
     852        self.toolbar.save_figure(evt) 
    865853 
    866854    def onContextMenu(self, event): 
     
    870858        """ 
    871859        # Slicer plot popup menu 
    872         id = wx.NewId() 
     860        wx_id = wx.NewId() 
    873861        slicerpop = wx.Menu() 
    874         slicerpop.Append(id, '&Save image', 'Save image as PNG') 
    875         wx.EVT_MENU(self, id, self.onSaveImage) 
    876  
    877         id = wx.NewId() 
    878         slicerpop.Append(id, '&Printer setup', 'Set image size') 
    879         wx.EVT_MENU(self, id, self.onPrinterSetup) 
    880  
    881         id = wx.NewId() 
    882         slicerpop.Append(id, '&Printer Preview', 'Set image size') 
    883         wx.EVT_MENU(self, id, self.onPrinterPreview) 
    884  
    885         id = wx.NewId() 
    886         slicerpop.Append(id, '&Print image', 'Print image ') 
    887         wx.EVT_MENU(self, id, self.onPrint) 
    888  
    889         id = wx.NewId() 
    890         slicerpop.Append(id, '&Copy', 'Copy to the clipboard') 
    891         wx.EVT_MENU(self, id, self.OnCopyFigureMenu) 
    892  
    893         #id = wx.NewId() 
    894         #slicerpop.Append(id, '&Load 1D data file') 
    895         #wx.EVT_MENU(self, id, self._onLoad1DData) 
    896  
    897         id = wx.NewId() 
     862        slicerpop.Append(wx_id, '&Save image', 'Save image as PNG') 
     863        wx.EVT_MENU(self, wx_id, self.onSaveImage) 
     864 
     865        wx_id = wx.NewId() 
     866        slicerpop.Append(wx_id, '&Printer setup', 'Set image size') 
     867        wx.EVT_MENU(self, wx_id, self.onPrinterSetup) 
     868 
     869        wx_id = wx.NewId() 
     870        slicerpop.Append(wx_id, '&Print image', 'Print image ') 
     871        wx.EVT_MENU(self, wx_id, self.onPrint) 
     872 
     873        wx_id = wx.NewId() 
     874        slicerpop.Append(wx_id, '&Copy', 'Copy to the clipboard') 
     875        wx.EVT_MENU(self, wx_id, self.OnCopyFigureMenu) 
     876 
     877        wx_id = wx.NewId() 
    898878        slicerpop.AppendSeparator() 
    899         slicerpop.Append(id, '&Properties') 
    900         wx.EVT_MENU(self, id, self._onProperties) 
    901  
    902         id = wx.NewId() 
     879        slicerpop.Append(wx_id, '&Properties') 
     880        wx.EVT_MENU(self, wx_id, self._onProperties) 
     881 
     882        wx_id = wx.NewId() 
    903883        slicerpop.AppendSeparator() 
    904         slicerpop.Append(id, '&Linear Fit') 
    905         wx.EVT_MENU(self, id, self.onFitting) 
    906  
    907         id = wx.NewId() 
     884        slicerpop.Append(wx_id, '&Linear Fit') 
     885        wx.EVT_MENU(self, wx_id, self.onFitting) 
     886 
     887        wx_id = wx.NewId() 
    908888        slicerpop.AppendSeparator() 
    909         slicerpop.Append(id, '&Toggle Legend On/Off', 'Toggle Legend On/Off') 
    910         wx.EVT_MENU(self, id, self.onLegend) 
     889        slicerpop.Append(wx_id, '&Toggle Legend On/Off', 'Toggle Legend On/Off') 
     890        wx.EVT_MENU(self, wx_id, self.onLegend) 
    911891 
    912892        loc_menu = wx.Menu() 
    913893        for label in self._loc_labels: 
    914             id = wx.NewId() 
    915             loc_menu.Append(id, str(label), str(label)) 
    916             wx.EVT_MENU(self, id, self.onChangeLegendLoc) 
    917         id = wx.NewId() 
    918         slicerpop.AppendMenu(id, '&Modify Legend Location', loc_menu) 
    919  
    920         id = wx.NewId() 
    921         slicerpop.Append(id, '&Modify Y Axis Label') 
    922         wx.EVT_MENU(self, id, self._on_yaxis_label) 
    923         id = wx.NewId() 
    924         slicerpop.Append(id, '&Modify X Axis Label') 
    925         wx.EVT_MENU(self, id, self._on_xaxis_label) 
     894            wx_id = wx.NewId() 
     895            loc_menu.Append(wx_id, str(label), str(label)) 
     896            wx.EVT_MENU(self, wx_id, self.onChangeLegendLoc) 
     897        wx_id = wx.NewId() 
     898        slicerpop.AppendMenu(wx_id, '&Modify Legend Location', loc_menu) 
     899 
     900        wx_id = wx.NewId() 
     901        slicerpop.Append(wx_id, '&Modify Y Axis Label') 
     902        wx.EVT_MENU(self, wx_id, self._on_yaxis_label) 
     903        wx_id = wx.NewId() 
     904        slicerpop.Append(wx_id, '&Modify X Axis Label') 
     905        wx.EVT_MENU(self, wx_id, self._on_xaxis_label) 
    926906 
    927907        try: 
     
    19221902        self.xmax = xmax 
    19231903        #In case need to change the range of data plotted 
    1924         list = [] 
    1925         list = self.graph.returnPlottable() 
    1926         for item in list: 
    1927             #item.onFitRange(xminView,xmaxView) 
     1904        for item in self.graph.returnPlottable(): 
    19281905            item.onFitRange(None, None) 
    19291906        # Create new data plottable with result 
     
    19691946        Reset the graph by plotting the full range of data 
    19701947        """ 
    1971         list = [] 
    1972         list = self.graph.returnPlottable() 
    1973         for item in list: 
     1948        for item in self.graph.returnPlottable(): 
    19741949            item.onReset() 
    19751950        self.graph.render(self) 
     
    19781953        self.toolbar.update() 
    19791954 
     1955    def onPrint(self, event=None): 
     1956        self.toolbar.print_figure(event) 
     1957 
    19801958    def onPrinterSetup(self, event=None): 
    19811959        """ 
     
    19861964    def onPrinterPreview(self, event=None): 
    19871965        """ 
     1966        Matplotlib camvas can no longer print itself.  Thus need to do 
     1967        everything ourselves: need to create a printpreview frame to to 
     1968        see the preview but needs a parent frame object.  Also needs a 
     1969        printout object (just as any printing task). 
    19881970        """ 
    19891971        try: 
    1990             self.canvas.Printer_Preview(event=event) 
    1991             self.Update() 
     1972            #check if parent is a frame.  If not keep getting the higher 
     1973            #parent till we find a frame 
     1974            _plot = self 
     1975            while not isinstance(_plot, wx.Frame): 
     1976                _plot = _plot.GetParent() 
     1977                assert _plot is not None 
     1978 
     1979            #now create the printpeview object 
     1980            _preview = wx.PrintPreview(PlotPrintout(self.canvas), 
     1981                                       PlotPrintout(self.canvas)) 
     1982            #and tie it to a printpreview frame then show it 
     1983            _frame = wx.PreviewFrame(_preview, _plot, "Print Preview", wx.Point(100, 100), wx.Size(600, 650)) 
     1984            _frame.Centre(wx.BOTH) 
     1985            _frame.Initialize() 
     1986            _frame.Show(True) 
    19921987        except: 
     1988            traceback.print_exc() 
    19931989            pass 
    19941990 
    1995     def onPrint(self, event=None): 
    1996         """ 
     1991    def OnCopyFigureMenu(self, evt): 
     1992        """ 
     1993        Copy the current figure to clipboard 
    19971994        """ 
    19981995        try: 
    1999             self.canvas.Printer_Print(event=event) 
    2000             self.Update() 
    2001         except: 
    2002             pass 
    2003  
    2004     def OnCopyFigureMenu(self, evt): 
    2005         """ 
    2006         Copy the current figure to clipboard 
    2007         """ 
    2008         try: 
    2009             CopyImage(self.canvas) 
     1996            self.toolbar.copy_figure() 
    20101997        except: 
    20111998            print "Error in copy Image" 
  • src/sas/plottools/TextDialog.py

    r3477478 r649806d  
    88    FONT_VARIANT = 1 
    99    PNL_WIDTH = 500 
    10 FAMILY = ['serif', 'sas-serif', 'fantasy', 'monospace'] 
     10FAMILY = ['serif', 'sans-serif', 'fantasy', 'monospace'] 
    1111SIZE = [8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72] 
    1212STYLE = ['normal', 'italic'] 
     
    2020        Dialog window pops- up when selecting 'Add Text' on the toolbar 
    2121        """ 
    22         wx.Dialog.__init__(self, parent, id, title, size=(PNL_WIDTH, 280)) 
     22        wx.Dialog.__init__(self, parent, id, title, size=(PNL_WIDTH, 300)) 
    2323        self.parent = parent 
    2424        # Font 
     
    3535        text_box = wx.BoxSizer(wx.HORIZONTAL) 
    3636        sizer = wx.GridBagSizer(1, 3) 
    37         _BOX_WIDTH = 60 
    38         font_description = wx.StaticBox(self, -1, 'Font', size=(PNL_WIDTH - 20, 70)) 
     37        _BOX_WIDTH = 70 
     38        font_description = wx.StaticBox(self, -1, 'Font') 
    3939        font_box = wx.StaticBoxSizer(font_description, wx.VERTICAL) 
    4040        family_box = wx.BoxSizer(wx.HORIZONTAL) 
     
    103103        self.font_style.SetToolTipString("Font style of the text.") 
    104104        # font color 
    105         self.font_color = wx.ComboBox(self, -1, style=wx.CB_READONLY) 
     105        self.font_color = wx.ComboBox(self, -1, style = wx.CB_READONLY) 
    106106        wx.EVT_COMBOBOX(self.font_color, -1, self.on_color) 
    107107        self.font_color.SetMinSize((_BOX_WIDTH, -1)) 
     
    111111        # Buttons on the bottom 
    112112        self.static_line_1 = wx.StaticLine(self, -1) 
    113         self.ok_button = wx.Button(self, wx.ID_OK, 'OK', size=(_BOX_WIDTH, 25)) 
    114         self.close_button = wx.Button(self, wx.ID_CANCEL, 'Cancel', size=(_BOX_WIDTH, 25)) 
     113        self.ok_button = wx.Button(self, wx.ID_OK, 'OK', 
     114                                   size = (_BOX_WIDTH, 25)) 
     115        self.close_button = wx.Button(self, wx.ID_CANCEL, 'Cancel', 
     116                                      size = (_BOX_WIDTH, 25)) 
    115117 
    116118        # Intro 
     
    121123        sizer.Add(wx.StaticText(self, -1, explanation), (iy, ix), 
    122124                  (1, 1), wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
    123         family_box.Add(wx.StaticText(self, -1, 'Family :'), -1, 0) 
    124         family_box.Add(self.font_family, -1, 0) 
     125        family_box.Add(wx.StaticText(self, -1, 'Family :', size = (50, -1)), 
     126                       0, wx.TOP, 5) 
     127        family_box.Add(self.font_family, 0, 0) 
    125128        family_box.Add((_BOX_WIDTH / 2, -1)) 
    126         family_box.Add(wx.StaticText(self, -1, 'Size :'), -1, 0) 
    127         family_box.Add(self.font_size, -1, 0) 
     129        family_box.Add(wx.StaticText(self, -1, 'Size :', size = (50, -1)), 
     130                       0, wx.TOP, 5) 
     131        family_box.Add(self.font_size, 0, 0) 
    128132        if unit_box != None: 
    129133            family_box.Add((_BOX_WIDTH / 2, -1)) 
    130             family_box.Add(tick_label_text, -1, 0) 
    131             family_box.Add(self.tick_label_check, -1, 0) 
    132         style_box.Add(wx.StaticText(self, -1, 'Style :'), -1, 0) 
    133         style_box.Add(self.font_style, -1, 0) 
     134            family_box.Add(tick_label_text, 0, 0) 
     135            family_box.Add(self.tick_label_check, 0, 0) 
     136        style_box.Add(wx.StaticText(self, -1, 'Style :', size = (50, -1)), 
     137                      0, wx.TOP, 5) 
     138        style_box.Add(self.font_style, 0, 0) 
    134139        style_box.Add((_BOX_WIDTH / 2, -1)) 
    135         style_box.Add(wx.StaticText(self, -1, 'Weight :'), -1, 0) 
    136         style_box.Add(self.font_weight, -1, 0) 
     140        style_box.Add(wx.StaticText(self, -1, 'Weight :', size = (50, -1)), 
     141                      0, wx.TOP, 5) 
     142        style_box.Add(self.font_weight, 0, 0) 
    137143        style_box.Add((_BOX_WIDTH / 2, -1)) 
    138         style_box.Add(wx.StaticText(self, -1, 'Color :'), -1, 0) 
    139         style_box.Add(self.font_color, -1, 0) 
    140         font_box.Add(family_box, -1, 10) 
    141         font_box.Add(style_box, -1, 10) 
     144        style_box.Add(wx.StaticText(self, -1, 'Color :', size = (45, -1)), 
     145                      0, wx.TOP, 5) 
     146        style_box.Add(self.font_color, 0, 0) 
     147        font_box.Add(family_box, 0, 10) 
     148        font_box.Add((0,5)) 
     149        font_box.Add(style_box, 0, 10) 
    142150        iy += 1 
    143151        ix = 0 
     
    152160        vbox.Add(text_box, 0, wx.EXPAND, 15) 
    153161        if unit_box != None: 
    154             unit_box.Add(unit_text, -1, 0) 
    155             unit_box.Add(self.unit_ctrl, -1, 0) 
     162            unit_box.Add(unit_text, 0, 0) 
     163            unit_box.Add(self.unit_ctrl, 0, 0) 
    156164            vbox.Add((5, 5)) 
    157165            vbox.Add(unit_box, 0, wx.LEFT, 15) 
  • src/sas/plottools/config.py

    r79492222 rd3d67f0  
    5858matplotlib.rcParams[param] = 0.05 
    5959matplotlib.rcParams['legend.numpoints'] = 1 
     60 
     61# this should happen after initial matplotlib configuration 
     62from .toolbar import NavigationToolBar 
     63from matplotlib.backends import backend_wxagg 
     64backend_wxagg.NavigationToolbar2WxAgg = NavigationToolBar 
     65 
     66# CRUFT: bumps 0.7.5.6 and older uses wrong toolbar 
     67backend_wxagg.NavigationToolbar2Wx = NavigationToolBar 
  • src/sas/plottools/toolbar.py

    r3477478 rd3d67f0  
    3131    def _init_toolbar(self): 
    3232        self._parent = self.canvas.GetParent() 
    33         _NTB2_HOME = wx.NewId() 
     33        self._NTB2_HOME = wx.NewId() 
    3434        self._NTB2_BACK = wx.NewId() 
    3535        self._NTB2_FORWARD = wx.NewId() 
    3636        self._NTB2_PAN = wx.NewId() 
    3737        self._NTB2_ZOOM = wx.NewId() 
    38         _NTB2_SAVE = wx.NewId() 
    39         _NTB2_PRINT = wx.NewId() 
    40         _NTB2_RESET = wx.NewId() 
     38        self._NTB2_SAVE = wx.NewId() 
     39        self._NTB2_PRINT = wx.NewId() 
     40        self._NTB2_RESET = wx.NewId() 
    4141 
    4242        # for mpl 1.2+ compatibility 
     
    5353        context_tip += '    right-click the data symbols.' 
    5454        context = wx.ArtProvider.GetBitmap(wx.ART_LIST_VIEW, wx.ART_TOOLBAR) 
    55         self.AddSimpleTool(_NTB2_HOME, context, context_tip, context_tip) 
     55        self.AddSimpleTool(self._NTB2_HOME, context, context_tip, context_tip) 
    5656 
    5757        self.InsertSeparator(1) 
     
    6969 
    7070        self.AddSeparator() 
    71         self.AddSimpleTool(_NTB2_SAVE, _load_bitmap('filesave.png'), 
     71        self.AddSimpleTool(self._NTB2_SAVE, _load_bitmap('filesave.png'), 
    7272                           'Save', 'Save plot contents to file') 
    7373 
    7474        print_bmp = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR) 
    75         self.AddSimpleTool(_NTB2_PRINT, print_bmp, 'Print', 'Print plot') 
     75        self.AddSimpleTool(self._NTB2_PRINT, print_bmp, 'Print', 'Print plot') 
    7676 
    7777        reset_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_TOOLBAR) 
    78         self.AddSimpleTool(_NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range') 
     78        self.AddSimpleTool(self._NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range') 
    7979 
    80         bind(self, wx.EVT_TOOL, self.on_menu, id=_NTB2_HOME) 
     80        bind(self, wx.EVT_TOOL, self.context_menu, id=self._NTB2_HOME) 
    8181        bind(self, wx.EVT_TOOL, self.forward, id=self._NTB2_FORWARD) 
    8282        bind(self, wx.EVT_TOOL, self.back, id=self._NTB2_BACK) 
    8383        bind(self, wx.EVT_TOOL, self.zoom, id=self._NTB2_ZOOM) 
    8484        bind(self, wx.EVT_TOOL, self.pan, id=self._NTB2_PAN) 
    85         bind(self, wx.EVT_TOOL, self.save_figure, id=_NTB2_SAVE) 
    86         bind(self, wx.EVT_TOOL, self.on_print, id=_NTB2_PRINT) 
    87         bind(self, wx.EVT_TOOL, self.on_reset, id=_NTB2_RESET) 
     85        bind(self, wx.EVT_TOOL, self.save_figure, id=self._NTB2_SAVE) 
     86        bind(self, wx.EVT_TOOL, self.print_figure, id=self._NTB2_PRINT) 
     87        bind(self, wx.EVT_TOOL, self.home, id=self._NTB2_RESET) 
    8888 
    8989        self.Realize() 
    9090 
    9191    def on_menu(self, event): 
    92         """ 
    93             Plot menu 
    94         """ 
    9592        try: 
    9693            self._parent.onToolContextMenu(event=event) 
     
    9895            logging.error("Plot toolbar could not show menu") 
    9996 
    100     def on_reset(self, event): 
     97    def context_menu(self, event): 
    10198        """ 
    102             Reset plot 
     99        Default context menu for a plot panel 
     100 
    103101        """ 
     102        # Slicer plot popup menu 
     103        wx_id = wx.NewId() 
     104        popup = wx.Menu() 
     105        popup.Append(wx_id, '&Save image', 'Save image as PNG') 
     106        wx.EVT_MENU(self, wx_id, self.save_figure) 
     107 
     108        wx_id = wx.NewId() 
     109        popup.Append(wx_id, '&Print image', 'Print image ') 
     110        wx.EVT_MENU(self, wx_id, self.print_figure) 
     111 
     112        wx_id = wx.NewId() 
     113        popup.Append(wx_id, '&Copy to Clipboard', 'Copy image to the clipboard') 
     114        wx.EVT_MENU(self, wx_id, self.copy_figure) 
     115 
     116        # Show the popup menu relative to the location of the toolbar 
     117        self.PopupMenu(popup, (0,0)) 
     118 
     119 
     120    def print_figure(self, event): 
    104121        try: 
    105             self._parent.onResetGraph(event=event) 
     122            _printer = wx.Printer() 
     123            _printer.Print(self.canvas, PlotPrintout(self.canvas), True) 
    106124        except: 
    107             logging.error("Plot toolbar could not reset plot") 
     125            import traceback 
     126            logging.error(traceback.format_exc()) 
    108127 
    109     def on_print(self, event): 
     128    def copy_figure(self, event): 
     129        copy_image_to_clipboard(self.canvas) 
     130 
     131class PlotPrintout(wx.Printout): 
     132    """ 
     133    Create the wx.Printout object for matplotlib figure from the PlotPanel. 
     134    Provides the required OnPrintPage and HasPage overrides.  Other methods 
     135    may be added/overriden in the future. 
     136    :TODO: this needs LOTS of TLC .. but fixes immediate problem 
     137    """ 
     138    def __init__(self, canvas): 
    110139        """ 
    111             Print 
     140        Initialize wx.Printout and get passed figure object 
    112141        """ 
    113         try: 
    114             self.canvas.Printer_Preview(event=event) 
    115         except: 
    116             logging.error("Plot toolbar could not print") 
     142        wx.Printout.__init__(self) 
     143        self.canvas = canvas 
     144 
     145    def OnPrintPage(self, page): 
     146        """ 
     147        Most rudimentry OnPrintPage overide.  instatiates a dc object, gets 
     148        its size, gets the size of the figure object, scales it to the dc 
     149        canvas size keeping the aspect ratio intact, then prints as bitmap 
     150        """ 
     151        _dc = self.GetDC() 
     152        (_dcX, _dcY) = _dc.GetSizeTuple() 
     153        (_bmpX,_bmpY) = self.canvas.GetSize() 
     154        _scale = min(_dcX/_bmpX, _dcY/_bmpY) 
     155        _dc.SetUserScale(_scale, _scale) 
     156        _dc.DrawBitmap(self.canvas.bitmap, 0, 0, False,) 
     157        return True 
     158 
     159    def GetPageInfo(self): 
     160        """ 
     161        just sets the page to 1 - no flexibility for now 
     162        """ 
     163        return (1, 1, 1, 1) 
     164 
     165 
     166def copy_image_to_clipboard(canvas): 
     167    bmp = wx.BitmapDataObject() 
     168    bmp.SetBitmap(canvas.bitmap) 
     169 
     170    wx.TheClipboard.Open() 
     171    wx.TheClipboard.SetData(bmp) 
     172    wx.TheClipboard.Close() 
     173 
     174 
Note: See TracChangeset for help on using the changeset viewer.