Changeset 348bc8b in sasview for src


Ignore:
Timestamp:
Aug 17, 2016 6:08:39 AM (8 years ago)
Author:
lewis
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, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
254f088
Parents:
4699761 (diff), e4c897b (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 branch 'master' into file-converter

Location:
src/sas
Files:
17 added
18 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/guiframe/data_panel.py

    rb5c44f0 re767897  
    22#This software was developed by the University of Tennessee as part of the 
    33#Distributed Data Analysis of Neutron Scattering Experiments (DANSE) 
    4 #project funded by the US National Science Foundation.  
     4#project funded by the US National Science Foundation. 
    55# 
    66#See the license text in license.txt 
     
    4141        as QucikPlotDialog 
    4242import sas.sasgui.guiframe.config as config 
    43   
     43 
    4444extension_list = [] 
    4545if config.APPLICATION_STATE_EXTENSION is not None: 
    4646    extension_list.append(config.APPLICATION_STATE_EXTENSION) 
    47 EXTENSIONS = config.PLUGIN_STATE_EXTENSIONS + extension_list    
     47EXTENSIONS = config.PLUGIN_STATE_EXTENSIONS + extension_list 
    4848PLUGINS_WLIST = config.PLUGINS_WLIST 
    4949APPLICATION_WLIST = config.APPLICATION_WLIST 
    5050 
    51 #Control panel width  
     51#Control panel width 
    5252if sys.platform.count("win32") > 0: 
    5353    PANEL_WIDTH = 235 
     
    6767STYLE_FLAG = wx.RAISED_BORDER|CT.TR_HAS_BUTTONS| CT.TR_HIDE_ROOT|\ 
    6868                    wx.WANTS_CHARS|CT.TR_HAS_VARIABLE_ROW_HEIGHT 
    69                      
    70                      
     69 
     70 
    7171class DataTreeCtrl(CT.CustomTreeCtrl): 
    7272    """ 
     
    9797                    CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds) 
    9898        self.root = self.AddRoot("Available Data") 
    99                     
     99 
    100100    def OnCompareItems(self, item1, item2): 
    101         """  
    102         Overrides OnCompareItems in wx.TreeCtrl.  
    103         Used by the SortChildren method.  
     101        """ 
     102        Overrides OnCompareItems in wx.TreeCtrl. 
     103        Used by the SortChildren method. 
    104104        """ 
    105105        # Get the item data 
     
    113113        else: 
    114114            return 0 
    115          
     115 
    116116class DataPanel(ScrolledPanel, PanelBase): 
    117117    """ 
    118     This panel displays data available in the application and widgets to  
     118    This panel displays data available in the application and widgets to 
    119119    interact with data. 
    120120    """ 
     
    123123    ## Title to appear on top of the window 
    124124    window_caption = "Data Explorer" 
    125     #type of window  
     125    #type of window 
    126126    window_type = "Data Panel" 
    127127    ## Flag to tell the GUI manager that this panel is not 
    128128    #  tied to any perspective 
    129129    #ALWAYS_ON = True 
    130     def __init__(self, parent,  
     130    def __init__(self, parent, 
    131131                 list=None, 
    132132                 size=(PANEL_WIDTH, PANEL_HEIGHT), 
     
    138138        PanelBase.__init__(self, parent) 
    139139        self.SetupScrolling() 
    140         #Set window's font size  
     140        #Set window's font size 
    141141        self.SetWindowVariant(variant=FONT_VARIANT) 
    142         self.loader = Loader()   
     142        self.loader = Loader() 
    143143        #Default location 
    144         self._default_save_location = None   
     144        self._default_save_location = None 
    145145        self.all_data1d = True 
    146146        self.parent = parent.parent 
     
    188188        if self.parent is not None: 
    189189            self.parent.Bind(EVT_DELETE_PLOTPANEL, self._on_delete_plot_panel) 
    190       
     190 
    191191    def do_layout(self): 
    192192        """ 
     
    198198        self.layout_batch() 
    199199        self.layout_button() 
    200          
     200 
    201201    def disable_app_combo(self, enable): 
    202202        """ 
     
    204204        """ 
    205205        self.perspective_cbox.Enable(enable) 
    206          
     206 
    207207    def define_panel_structure(self): 
    208208        """ 
     
    213213        self.sizer1 = wx.BoxSizer(wx.VERTICAL) 
    214214        self.sizer1.SetMinSize(wx.Size(w/13, h*2/5)) 
    215        
     215 
    216216        self.sizer2 = wx.BoxSizer(wx.VERTICAL) 
    217217        self.sizer3 = wx.FlexGridSizer(9, 2, 4, 1) 
    218218        self.sizer4 = wx.BoxSizer(wx.VERTICAL) 
    219219        self.sizer5 = wx.BoxSizer(wx.VERTICAL) 
    220         
     220 
    221221        self.vbox.Add(self.sizer5, 0, wx.EXPAND|wx.ALL, 1) 
    222222        self.vbox.Add(self.sizer1, 1, wx.EXPAND|wx.ALL, 0) 
     
    224224        self.vbox.Add(self.sizer3, 0, wx.EXPAND|wx.ALL, 10) 
    225225        #self.vbox.Add(self.sizer4, 0, wx.EXPAND|wx.ALL,5) 
    226          
     226 
    227227        self.SetSizer(self.vbox) 
    228          
     228 
    229229    def layout_selection(self): 
    230230        """ 
     
    244244        self.selection_cbox.SetValue('Select all Data') 
    245245        wx.EVT_COMBOBOX(self.selection_cbox, -1, self._on_selection_type) 
    246         self.sizer5.AddMany([(select_txt, 0, wx.ALL, 5),  
     246        self.sizer5.AddMany([(select_txt, 0, wx.ALL, 5), 
    247247                            (self.selection_cbox, 0, wx.ALL,5)]) 
    248248        self.enable_selection() 
    249          
    250      
     249 
     250 
    251251    def _on_selection_type(self, event): 
    252252        """ 
     
    254254            :param event: UI event 
    255255        """ 
     256        def check_item_and_children(control, check_value=True): 
     257            self.tree_ctrl.CheckItem(data_ctrl, check_value) 
     258            if data_ctrl.HasChildren(): 
     259                if check_value == True and not control.IsExpanded(): 
     260                    # Only select children if control is expanded 
     261                    # Always deselect children, regardless (see ticket #259) 
     262                    return 
     263                for child_ctrl in data_ctrl.GetChildren(): 
     264                    self.tree_ctrl.CheckItem(child_ctrl, check_value) 
     265 
    256266        option = self.selection_cbox.GetValue() 
    257          
     267 
    258268        pos = self.selection_cbox.GetSelection() 
    259269        if pos == wx.NOT_FOUND: 
    260             return  
     270            return 
    261271        option = self.selection_cbox.GetString(pos) 
    262272        for item in self.list_cb_data.values(): 
    263273            data_ctrl, _, _, _, _, _, _, _ = item 
    264             _, data_class, _ = self.tree_ctrl.GetItemPyData(data_ctrl)  
     274            _, data_class, _ = self.tree_ctrl.GetItemPyData(data_ctrl) 
    265275            if option == 'Select all Data': 
    266                 self.tree_ctrl.CheckItem(data_ctrl, True)  
     276                check_item_and_children(data_ctrl, check_value=True) 
    267277            elif option == 'Unselect all Data': 
    268                 self.tree_ctrl.CheckItem(data_ctrl, False) 
     278                check_item_and_children(data_ctrl, check_value=False) 
    269279            elif option == 'Select all Data 1D': 
    270280                if data_class == 'Data1D': 
    271                     self.tree_ctrl.CheckItem(data_ctrl, True)  
     281                    check_item_and_children(data_ctrl, check_value=True) 
    272282            elif option == 'Unselect all Data 1D': 
    273283                if data_class == 'Data1D': 
    274                     self.tree_ctrl.CheckItem(data_ctrl, False)  
    275             elif option == 'Select all Data 1D': 
    276                 if data_class == 'Data1D': 
    277                     self.tree_ctrl.CheckItem(data_ctrl, True)  
     284                    check_item_and_children(data_ctrl, check_value=False) 
    278285            elif option == 'Select all Data 2D': 
    279286                if data_class == 'Data2D': 
    280                     self.tree_ctrl.CheckItem(data_ctrl, True)  
     287                    check_item_and_children(data_ctrl, check_value=True) 
    281288            elif option == 'Unselect all Data 2D': 
    282289                if data_class == 'Data2D': 
    283                     self.tree_ctrl.CheckItem(data_ctrl, False)  
     290                    check_item_and_children(data_ctrl, check_value=False) 
    284291        self.enable_append() 
    285292        self.enable_freeze() 
     
    287294        self.enable_import() 
    288295        self.enable_remove() 
    289                 
     296 
    290297    def layout_button(self): 
    291298        """ 
     
    293300        """ 
    294301        #Load Data Button 
    295         self.bt_add = wx.Button(self, wx.NewId(), "Load Data",  
     302        self.bt_add = wx.Button(self, wx.NewId(), "Load Data", 
    296303                                size=(BUTTON_WIDTH, -1)) 
    297304        self.bt_add.SetToolTipString("Load data files") 
    298305        wx.EVT_BUTTON(self, self.bt_add.GetId(), self._load_data) 
    299          
     306 
    300307        #Delete Data Button 
    301308        self.bt_remove = wx.Button(self, wx.NewId(), "Delete Data", 
     
    303310        self.bt_remove.SetToolTipString("Delete data from the application") 
    304311        wx.EVT_BUTTON(self, self.bt_remove.GetId(), self.on_remove) 
    305          
     312 
    306313        #Send data to perspective button 
    307314        self.bt_import = wx.Button(self, wx.NewId(), "Send To", 
     
    309316        self.bt_import.SetToolTipString("Send Data set to active perspective") 
    310317        wx.EVT_BUTTON(self, self.bt_import.GetId(), self.on_import) 
    311          
     318 
    312319        #Choose perspective to be send data to combo box 
    313320        self.perspective_cbox = wx.ComboBox(self, -1, 
     
    315322        if not IS_MAC: 
    316323            self.perspective_cbox.SetMinSize((BUTTON_WIDTH*1.6, -1)) 
    317         wx.EVT_COMBOBOX(self.perspective_cbox, -1,  
     324        wx.EVT_COMBOBOX(self.perspective_cbox, -1, 
    318325                        self._on_perspective_selection) 
    319      
     326 
    320327        #Append data to current Graph Button 
    321328        self.bt_append_plot = wx.Button(self, wx.NewId(), "Append Plot To", 
     
    324331                                "Plot the selected data in the active panel") 
    325332        wx.EVT_BUTTON(self, self.bt_append_plot.GetId(), self.on_append_plot) 
    326          
     333 
    327334        #Create a new graph and send data to that new graph button 
    328         self.bt_plot = wx.Button(self, wx.NewId(), "New Plot",  
     335        self.bt_plot = wx.Button(self, wx.NewId(), "New Plot", 
    329336                                 size=(BUTTON_WIDTH, -1)) 
    330337        self.bt_plot.SetToolTipString("To trigger plotting") 
    331338        wx.EVT_BUTTON(self, self.bt_plot.GetId(), self.on_plot) 
    332          
     339 
    333340        #Freeze current theory button - becomes a data set and stays on graph 
    334         self.bt_freeze = wx.Button(self, wx.NewId(), "Freeze Theory",  
     341        self.bt_freeze = wx.Button(self, wx.NewId(), "Freeze Theory", 
    335342                                   size=(BUTTON_WIDTH, -1)) 
    336343        freeze_tip = "To trigger freeze a theory: making a copy\n" 
     
    339346        self.bt_freeze.SetToolTipString(freeze_tip) 
    340347        wx.EVT_BUTTON(self, self.bt_freeze.GetId(), self.on_freeze) 
    341         
     348 
    342349        #select plot to send to combo box (blank if no data) 
    343350        if sys.platform == 'darwin': 
    344             self.cb_plotpanel = wx.ComboBox(self, -1,  
     351            self.cb_plotpanel = wx.ComboBox(self, -1, 
    345352                                            style=wx.CB_READONLY) 
    346353        else: 
    347             self.cb_plotpanel = wx.ComboBox(self, -1,  
     354            self.cb_plotpanel = wx.ComboBox(self, -1, 
    348355                                            style=wx.CB_READONLY|wx.CB_SORT) 
    349356        wx.EVT_COMBOBOX(self.cb_plotpanel, -1, self._on_plot_selection) 
    350357        self.cb_plotpanel.Disable() 
    351          
     358 
    352359        #Help button 
    353360        self.bt_help = wx.Button(self, wx.NewId(), "HELP", 
     
    365372                             ((10, 10)), 
    366373                             (self.bt_append_plot), 
    367                              (self.cb_plotpanel,  
     374                             (self.cb_plotpanel, 
    368375                              wx.EXPAND|wx.ADJUST_MINSIZE, 5), 
    369376                             ((5, 5)), 
    370377                             ((5, 5)), 
    371378                             (self.bt_import, 0, wx.EXPAND|wx.RIGHT, 5), 
    372                              (self.perspective_cbox,  
     379                             (self.perspective_cbox, 
    373380                              wx.EXPAND|wx.ADJUST_MINSIZE, 5), 
    374381                             ((10, 10)), 
     
    385392        self.enable_freeze() 
    386393        self.enable_remove_plot() 
    387          
     394 
    388395    def layout_batch(self): 
    389396        """ 
     
    397404        self.Bind(wx.EVT_RADIOBUTTON, self.on_batch_mode, 
    398405                   id=self.rb_batch_mode.GetId()) 
    399          
     406 
    400407        self.rb_single_mode.SetValue(not self.parent.batch_on) 
    401408        self.rb_batch_mode.SetValue(self.parent.batch_on) 
    402409        self.sizer4.AddMany([(self.rb_single_mode, 0, wx.ALL, 4), 
    403410                             (self.rb_batch_mode, 0, wx.ALL, 4)]) 
    404          
     411 
    405412    def on_single_mode(self, event): 
    406413        """ 
     
    410417        if self.parent is not None: 
    411418            wx.PostEvent(self.parent, NewBatchEvent(enable=False)) 
    412         
     419 
    413420    def on_batch_mode(self, event): 
    414421        """ 
     
    417424        """ 
    418425        if self.parent is not None: 
    419             wx.PostEvent(self.parent,  
     426            wx.PostEvent(self.parent, 
    420427                         NewBatchEvent(enable=True)) 
    421      
    422     def _get_data_selection(self, event):   
     428 
     429    def _get_data_selection(self, event): 
    423430        """ 
    424431            Get data selection from the right click 
     
    435442            data = theory_list.values()[0][0] 
    436443        return data 
    437      
     444 
    438445    def on_edit_data(self, event): 
    439446        """ 
     
    443450        from sas.sasgui.guiframe.local_perspectives.plotting.masking \ 
    444451            import MaskPanel as MaskDialog 
    445          
    446         panel = MaskDialog(parent=self.parent, base=self,  
     452 
     453        panel = MaskDialog(parent=self.parent, base=self, 
    447454                           data=data, id=wx.NewId()) 
    448455        panel.ShowModal() 
    449      
     456 
    450457    def on_plot_3d(self, event): 
    451458        """ 
     
    455462        from sas.sasgui.guiframe.local_perspectives.plotting.masking \ 
    456463        import FloatPanel as Float3dDialog 
    457          
    458         panel = Float3dDialog(base=self, data=data,  
     464 
     465        panel = Float3dDialog(base=self, data=data, 
    459466                              dimension=3, id=wx.NewId()) 
    460         panel.ShowModal()    
    461      
     467        panel.ShowModal() 
     468 
    462469    def on_quick_plot(self, event): 
    463470        """ 
     
    468475            dimension = 2 
    469476        else: 
    470             dimension = 1  
    471         #panel = QucikPlotDialog(base=self, data=data,  
     477            dimension = 1 
     478        #panel = QucikPlotDialog(base=self, data=data, 
    472479        #                        dimension=dimension, id=wx.NewId()) 
    473480        frame = QucikPlotDialog(self, -1, "Plot " + data.name, 'log_{10}') 
     
    477484        frame.Show(True) 
    478485        frame.SetFocus() 
    479         #panel.ShowModal()     
    480      
     486        #panel.ShowModal() 
     487 
    481488    def on_data_info(self, event): 
    482489        """ 
     
    488495        else: 
    489496            self.parent.show_data1d(data, data.name) 
    490          
     497 
    491498    def on_save_as(self, event): 
    492499        """ 
     
    506513            else: 
    507514                print "unable to save this type of data" 
    508          
     515 
    509516    def layout_data_list(self): 
    510517        """ 
     
    523530        self.data_menu.Append(id, name, msg) 
    524531        wx.EVT_MENU(self, id, self.on_data_info) 
    525          
     532 
    526533        id = wx.NewId() 
    527534        name = "Save As" 
     
    529536        self.data_menu.Append(id, name, msg) 
    530537        wx.EVT_MENU(self, id, self.on_save_as) 
    531      
     538 
    532539        quickplot_id = wx.NewId() 
    533540        name = "Quick Plot" 
     
    535542        self.data_menu.Append(quickplot_id, name, msg) 
    536543        wx.EVT_MENU(self, quickplot_id, self.on_quick_plot) 
    537          
     544 
    538545        self.plot3d_id = wx.NewId() 
    539546        name = "Quick 3DPlot (Slow)" 
     
    541548        self.data_menu.Append(self.plot3d_id, name, msg) 
    542549        wx.EVT_MENU(self, self.plot3d_id, self.on_plot_3d) 
    543              
     550 
    544551        self.editmask_id = wx.NewId() 
    545552        name = "Edit Mask" 
     
    547554        self.data_menu.Append(self.editmask_id, name, msg) 
    548555        wx.EVT_MENU(self, self.editmask_id, self.on_edit_data) 
    549          
     556 
    550557        tree_ctrl_theory_label = wx.StaticText(self, -1, "Theory") 
    551558        tree_ctrl_theory_label.SetForegroundColour('blue') 
    552         self.tree_ctrl_theory = DataTreeCtrl(parent=self,  
     559        self.tree_ctrl_theory = DataTreeCtrl(parent=self, 
    553560                                                    style=wx.SUNKEN_BORDER) 
    554         self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_CHECKING,  
     561        self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_CHECKING, 
    555562                                                    self.on_check_item) 
    556         self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_MENU,  
     563        self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_MENU, 
    557564                                   self.on_right_click_theory) 
    558565        self.sizer1.Add(tree_ctrl_label, 0, wx.LEFT, 10) 
     
    560567        self.sizer1.Add(tree_ctrl_theory_label, 0,  wx.LEFT, 10) 
    561568        self.sizer1.Add(self.tree_ctrl_theory, 1, wx.EXPAND|wx.ALL, 10) 
    562             
     569 
    563570    def on_right_click_theory(self, event): 
    564571        """ 
     
    575582            self.data_menu.Enable(self.editmask_id, False) 
    576583            self.data_menu.Enable(self.plot3d_id, menu_enable) 
    577             self.PopupMenu(self.data_menu)  
    578                     
     584            self.PopupMenu(self.data_menu) 
     585 
    579586    def on_right_click_data(self, event): 
    580587        """ 
     
    596603            self.data_menu.Enable(self.editmask_id, maskmenu_enable) 
    597604            self.data_menu.Enable(self.plot3d_id, menu_enable) 
    598             self.PopupMenu(self.data_menu)  
    599          
    600     def onContextMenu(self, event):  
     605            self.PopupMenu(self.data_menu) 
     606 
     607    def onContextMenu(self, event): 
    601608        """ 
    602609        Retrieve the state selected state 
     
    606613        pos = event.GetPosition() 
    607614        pos = self.ScreenToClient(pos) 
    608         self.PopupMenu(self.popUpMenu, pos)  
    609        
    610    
     615        self.PopupMenu(self.popUpMenu, pos) 
     616 
     617 
    611618    def on_check_item(self, event): 
    612619        """ 
     
    614621        """ 
    615622        item = event.GetItem() 
    616         item.Check(not item.IsChecked())  
     623        item.Check(not item.IsChecked()) 
    617624        self.enable_append() 
    618625        self.enable_freeze() 
     
    621628        self.enable_remove() 
    622629        event.Skip() 
    623          
     630 
    624631    def fill_cbox_analysis(self, plugin): 
    625632        """ 
     
    635642                if plug.get_perspective(): 
    636643                    self.perspective_cbox.Append(plug.sub_menu, plug) 
    637              
     644 
    638645            curr_pers = self.parent.get_current_perspective() 
    639646            if curr_pers: 
    640647                self.perspective_cbox.SetStringSelection(curr_pers.sub_menu) 
    641648                self.enable_import() 
    642                          
     649 
    643650    def load_data_list(self, list): 
    644651        """ 
     
    654661                    data_run = str(data.run) 
    655662                    data_class = data.__class__.__name__ 
    656                     path = dstate.get_path()  
     663                    path = dstate.get_path() 
    657664                    process_list = data.process 
    658665                    data_id = data.id 
     
    661668                        #new state 
    662669                        data_c = self.tree_ctrl.InsertItem(self.tree_ctrl.root, 
    663                                         0, data_name, ct_type=1,  
     670                                        0, data_name, ct_type=1, 
    664671                                        data=(data_id, data_class, state_id)) 
    665672                        data_c.Check(True) 
    666673                        d_i_c = self.tree_ctrl.AppendItem(data_c, 'Info') 
    667                         d_t_c = self.tree_ctrl.AppendItem(d_i_c,  
     674                        d_t_c = self.tree_ctrl.AppendItem(d_i_c, 
    668675                                                      'Title: %s' % data_title) 
    669                         r_n_c = self.tree_ctrl.AppendItem(d_i_c,  
     676                        r_n_c = self.tree_ctrl.AppendItem(d_i_c, 
    670677                                                      'Run: %s' % data_run) 
    671                         i_c_c = self.tree_ctrl.AppendItem(d_i_c,  
     678                        i_c_c = self.tree_ctrl.AppendItem(d_i_c, 
    672679                                                      'Type: %s' % data_class) 
    673680                        p_c_c = self.tree_ctrl.AppendItem(d_i_c, 
    674681                                                      "Path: '%s'" % s_path) 
    675682                        d_p_c = self.tree_ctrl.AppendItem(d_i_c, 'Process') 
    676                          
     683 
    677684                        for process in process_list: 
    678685                            process_str = str(process).replace('\n',' ') 
     
    680687                                process_str = process_str[:20]+' [...]' 
    681688                            self.tree_ctrl.AppendItem(d_p_c, process_str) 
    682                         theory_child = self.tree_ctrl.AppendItem(data_c,  
     689                        theory_child = self.tree_ctrl.AppendItem(data_c, 
    683690                                                                 "THEORIES") 
    684                         self.list_cb_data[state_id] = [data_c,  
     691                        self.list_cb_data[state_id] = [data_c, 
    685692                                                       d_i_c, 
    686693                                                       d_t_c, 
     
    695702                        data_c, d_i_c, d_t_c, r_n_c,  i_c_c, p_c_c, d_p_c, _ \ 
    696703                                = data_ctrl_list 
    697                         self.tree_ctrl.SetItemText(data_c, data_name)  
     704                        self.tree_ctrl.SetItemText(data_c, data_name) 
    698705                        temp = (data_id, data_class, state_id) 
    699                         self.tree_ctrl.SetItemPyData(data_c, temp)  
    700                         self.tree_ctrl.SetItemText(i_c_c,  
     706                        self.tree_ctrl.SetItemPyData(data_c, temp) 
     707                        self.tree_ctrl.SetItemText(i_c_c, 
    701708                                                   'Type: %s' % data_class) 
    702                         self.tree_ctrl.SetItemText(p_c_c,  
    703                                                    'Path: %s' % s_path)  
    704                         self.tree_ctrl.DeleteChildren(d_p_c)  
     709                        self.tree_ctrl.SetItemText(p_c_c, 
     710                                                   'Path: %s' % s_path) 
     711                        self.tree_ctrl.DeleteChildren(d_p_c) 
    705712                        for process in process_list: 
    706713                            if not process.is_empty(): 
     
    710717            # Sort by data name 
    711718            if self.tree_ctrl.root: 
    712                 self.tree_ctrl.SortChildren(self.tree_ctrl.root)     
     719                self.tree_ctrl.SortChildren(self.tree_ctrl.root) 
    713720        self.enable_remove() 
    714721        self.enable_import() 
     
    716723        self.enable_freeze() 
    717724        self.enable_selection() 
    718          
     725 
    719726    def _uncheck_all(self): 
    720727        """ 
     
    723730        for item in self.list_cb_data.values(): 
    724731            data_ctrl, _, _, _, _, _, _, _ = item 
    725             self.tree_ctrl.CheckItem(data_ctrl, False)  
     732            self.tree_ctrl.CheckItem(data_ctrl, False) 
    726733        self.enable_append() 
    727734        self.enable_freeze() 
     
    729736        self.enable_import() 
    730737        self.enable_remove() 
    731     
     738 
    732739    def append_theory(self, state_id, theory_list): 
    733740        """ 
     
    736743        """ 
    737744        if not theory_list: 
    738             return  
     745            return 
    739746        if state_id not in self.list_cb_data.keys(): 
    740747            root = self.tree_ctrl_theory.root 
     
    746753            tree = self.tree_ctrl 
    747754        if root is not None: 
    748             wx.CallAfter(self.append_theory_helper, tree=tree, root=root,  
    749                                        state_id=state_id,  
     755            wx.CallAfter(self.append_theory_helper, tree=tree, root=root, 
     756                                       state_id=state_id, 
    750757                                       theory_list=theory_list) 
    751        
    752        
     758 
     759 
    753760    def append_theory_helper(self, tree, root, state_id, theory_list): 
    754761        """ 
     
    778785                                                    name, ct_type=1, data=temp) 
    779786                    t_i_c = tree.AppendItem(t_child, 'Info') 
    780                     i_c_c = tree.AppendItem(t_i_c,  
     787                    i_c_c = tree.AppendItem(t_i_c, 
    781788                                                  'Type: %s' % theory_class) 
    782789                    t_p_c = tree.AppendItem(t_i_c, 'Process') 
    783                      
     790 
    784791                    for process in theory_data.process: 
    785792                        tree.AppendItem(t_p_c, process.__str__()) 
    786                     theory_list_ctrl[theory_id] = [t_child,  
    787                                                    i_c_c,  
     793                    theory_list_ctrl[theory_id] = [t_child, 
     794                                                   i_c_c, 
    788795                                                   t_p_c] 
    789796                else: 
    790797                    #replace theory 
    791798                    t_child, i_c_c, t_p_c = theory_list_ctrl[theory_id] 
    792                     tree.SetItemText(t_child, name)  
    793                     tree.SetItemPyData(t_child, temp)  
    794                     tree.SetItemText(i_c_c, 'Type: %s' % theory_class)  
    795                     tree.DeleteChildren(t_p_c)  
     799                    tree.SetItemText(t_child, name) 
     800                    tree.SetItemPyData(t_child, temp) 
     801                    tree.SetItemText(i_c_c, 'Type: %s' % theory_class) 
     802                    tree.DeleteChildren(t_p_c) 
    796803                    for process in theory_data.process: 
    797804                        tree.AppendItem(t_p_c, process.__str__()) 
    798                
     805 
    799806        else: 
    800807            #data didn't have a theory associated it before 
     
    807814                    theory_id = theory_data.id 
    808815                    #if theory_state is not None: 
    809                     #    name = theory_state.model.name  
     816                    #    name = theory_state.model.name 
    810817                    temp = (theory_id, theory_class, state_id) 
    811818                    t_child = tree.AppendItem(root, 
    812                             name, ct_type=1,  
     819                            name, ct_type=1, 
    813820                            data=(theory_data.id, theory_class, state_id)) 
    814821                    t_i_c = tree.AppendItem(t_child, 'Info') 
    815                     i_c_c = tree.AppendItem(t_i_c,  
     822                    i_c_c = tree.AppendItem(t_i_c, 
    816823                                                  'Type: %s' % theory_class) 
    817824                    t_p_c = tree.AppendItem(t_i_c, 'Process') 
    818                      
     825 
    819826                    for process in theory_data.process: 
    820827                        tree.AppendItem(t_p_c, process.__str__()) 
    821              
     828 
    822829                    theory_list_ctrl[theory_id] = [t_child, i_c_c, t_p_c] 
    823830                #self.list_cb_theory[data_id] = theory_list_ctrl 
    824831                self.list_cb_theory[state_id] = theory_list_ctrl 
    825          
    826              
    827     
     832 
     833 
     834 
    828835    def set_data_helper(self): 
    829836        """ 
     
    840847                if state_id not in state_to_plot: 
    841848                    state_to_plot.append(state_id) 
    842             
     849 
    843850        for theory_dict in self.list_cb_theory.values(): 
    844851            for _, value in theory_dict.iteritems(): 
     
    850857                        state_to_plot.append(state_id) 
    851858        return data_to_plot, theory_to_plot, state_to_plot 
    852      
     859 
    853860    def remove_by_id(self, id): 
    854861        """ 
     
    857864        for item in self.list_cb_data.values(): 
    858865            data_c, _, _, _, _, _,  _, _ = item 
    859             data_id, _, state_id = self.tree_ctrl.GetItemPyData(data_c)  
     866            data_id, _, state_id = self.tree_ctrl.GetItemPyData(data_c) 
    860867            if id == data_id: 
    861868                self.tree_ctrl.Delete(data_c) 
    862869                del self.list_cb_data[state_id] 
    863870                del self.list_cb_theory[data_id] 
    864                
     871 
    865872    def load_error(self, error=None): 
    866873        """ 
    867874        Pop up an error message. 
    868          
     875 
    869876        :param error: details error message to be displayed 
    870877        """ 
    871878        if error is not None or str(error).strip() != "": 
    872             dial = wx.MessageDialog(self.parent, str(error),  
     879            dial = wx.MessageDialog(self.parent, str(error), 
    873880                                    'Error Loading File', 
    874881                                    wx.OK | wx.ICON_EXCLAMATION) 
    875             dial.ShowModal()   
    876          
     882            dial.ShowModal() 
     883 
    877884    def _load_data(self, event): 
    878885        """ 
     
    881888        if self.parent is not None: 
    882889            wx.PostEvent(self.parent, NewLoadDataEvent()) 
    883              
     890 
    884891 
    885892    def on_remove(self, event): 
    886893        """ 
    887894        Get a list of item checked and remove them from the treectrl 
    888         Ask the parent to remove reference to this item  
     895        Ask the parent to remove reference to this item 
    889896        """ 
    890897        msg = "This operation will delete the data sets checked " 
     
    893900        if msg_box.ShowModal() != wx.ID_OK: 
    894901            return 
    895          
     902 
    896903        data_to_remove, theory_to_remove, _ = self.set_data_helper() 
    897904        data_key = [] 
     
    906913                    theory_list_ctrl = self.list_cb_theory[d_key] 
    907914                    theory_to_remove += theory_list_ctrl.keys() 
    908         # Remove theory from treectrl        
     915        # Remove theory from treectrl 
    909916        for _, theory_dict in self.list_cb_theory.iteritems(): 
    910917            for  key, value in theory_dict.iteritems(): 
     
    916923                        pass 
    917924                    theory_key.append(key) 
    918                      
     925 
    919926        #Remove data and related theory references 
    920927        for key in data_key: 
     
    934941                                pass 
    935942                    del theory_dict[key] 
    936                      
    937              
     943 
     944 
    938945        self.parent.remove_data(data_id=data_to_remove, 
    939946                                  theory_id=theory_to_remove) 
     
    941948        self.enable_freeze() 
    942949        self.enable_remove_plot() 
    943          
     950 
    944951    def on_import(self, event=None): 
    945952        """ 
     
    951958        temp = data_id + state_id 
    952959        self.parent.set_data(data_id=temp, theory_id=theory_id) 
    953          
     960 
    954961    def on_append_plot(self, event=None): 
    955962        """ 
     
    958965        self._on_plot_selection() 
    959966        data_id, theory_id, state_id = self.set_data_helper() 
    960         self.parent.plot_data(data_id=data_id,   
     967        self.parent.plot_data(data_id=data_id, 
    961968                              state_id=state_id, 
    962969                              theory_id=theory_id, 
    963970                              append=True) 
    964     
     971 
    965972    def on_plot(self, event=None): 
    966973        """ 
     
    968975        """ 
    969976        data_id, theory_id, state_id = self.set_data_helper() 
    970         self.parent.plot_data(data_id=data_id,   
     977        self.parent.plot_data(data_id=data_id, 
    971978                              state_id=state_id, 
    972979                              theory_id=theory_id, 
    973980                              append=False) 
    974981        self.enable_remove_plot() 
    975           
     982 
    976983    def on_close_page(self, event=None): 
    977984        """ 
     
    982989        # send parent to update menu with no show nor hide action 
    983990        self.parent.show_data_panel(action=False) 
    984      
     991 
    985992    def on_freeze(self, event): 
    986993        """ 
     
    9951002            msg = "Freeze Theory: Requires at least one theory checked." 
    9961003        wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    997              
     1004 
    9981005    def set_active_perspective(self, name): 
    9991006        """ 
     
    10021009        self.perspective_cbox.SetStringSelection(name) 
    10031010        self.enable_import() 
    1004          
     1011 
    10051012    def _on_delete_plot_panel(self, event): 
    10061013        """ 
    1007         get an event with attribute name and caption to delete existing name  
     1014        get an event with attribute name and caption to delete existing name 
    10081015        from the combobox of the current panel 
    10091016        """ 
     
    10111018        caption = event.caption 
    10121019        if self.cb_plotpanel is not None: 
    1013             pos = self.cb_plotpanel.FindString(str(caption))  
     1020            pos = self.cb_plotpanel.FindString(str(caption)) 
    10141021            if pos != wx.NOT_FOUND: 
    10151022                self.cb_plotpanel.Delete(pos) 
    10161023        self.enable_append() 
    1017          
     1024 
    10181025    def set_panel_on_focus(self, name=None): 
    10191026        """ 
     
    10311038        self.enable_append() 
    10321039        self.enable_remove_plot() 
    1033      
     1040 
    10341041    def set_plot_unfocus(self): 
    10351042        """ 
     
    10371044        """ 
    10381045        return 
    1039      
     1046 
    10401047    def _on_perspective_selection(self, event=None): 
    10411048        """ 
     
    10471054            perspective.on_perspective(event=None) 
    10481055            self.parent.check_multimode(perspective=perspective) 
    1049                  
     1056 
    10501057    def _on_plot_selection(self, event=None): 
    10511058        """ 
     
    10611068        if combo.GetValue() != 'None': 
    10621069            panel = combo.GetClientData(selection) 
    1063             self.parent.on_set_plot_focus(panel)    
    1064              
     1070            self.parent.on_set_plot_focus(panel) 
     1071 
    10651072    def on_close_plot(self, event): 
    10661073        """ 
    10671074        clseo the panel on focus 
    1068         """  
     1075        """ 
    10691076        self.enable_append() 
    10701077        selection = self.cb_plotpanel.GetSelection() 
     
    10721079            panel = self.cb_plotpanel.GetClientData(selection) 
    10731080            if self.parent is not None and panel is not None: 
    1074                 wx.PostEvent(self.parent,  
     1081                wx.PostEvent(self.parent, 
    10751082                             NewPlotEvent(group_id=panel.group_id, 
    10761083                                          action="delete")) 
    10771084        self.enable_remove_plot() 
    1078      
     1085 
    10791086    def set_frame(self, frame): 
    10801087        """ 
    10811088        """ 
    10821089        self.frame = frame 
    1083      
     1090 
    10841091    def get_frame(self): 
    10851092        """ 
    10861093        """ 
    1087         return self.frame  
    1088      
     1094        return self.frame 
     1095 
    10891096    def on_help(self, event): 
    10901097        """ 
     
    11151122        """ 
    11161123        self.parent.show_data_panel(event) 
    1117                          
     1124 
    11181125    def set_schedule_full_draw(self, panel=None, func='del'): 
    11191126        """ 
     
    11211128        """ 
    11221129        self.parent.set_schedule_full_draw(panel, func) 
    1123          
     1130 
    11241131    def enable_remove_plot(self): 
    11251132        """ 
     
    11311138        #else: 
    11321139        #    self.bt_close_plot.Enable() 
    1133              
     1140 
    11341141    def enable_remove(self): 
    11351142        """ 
     
    11421149        else: 
    11431150            self.bt_remove.Enable() 
    1144              
     1151 
    11451152    def enable_import(self): 
    11461153        """ 
     
    11601167        else: 
    11611168            self.perspective_cbox.Enable() 
    1162              
     1169 
    11631170    def enable_plot(self): 
    11641171        """ 
    11651172        enable or disable plot button 
    11661173        """ 
    1167         n_t = 0  
     1174        n_t = 0 
    11681175        n_t_t = 0 
    11691176        if self.tree_ctrl != None: 
     
    11761183            self.bt_plot.Enable() 
    11771184        self.enable_append() 
    1178         
     1185 
    11791186    def enable_append(self): 
    11801187        """ 
    11811188        enable or disable append button 
    11821189        """ 
    1183         n_t = 0  
     1190        n_t = 0 
    11841191        n_t_t = 0 
    11851192        if self.tree_ctrl != None: 
     
    11871194        if self.tree_ctrl_theory != None: 
    11881195            n_t_t = self.tree_ctrl_theory.GetCount() 
    1189         if n_t + n_t_t <= 0:  
     1196        if n_t + n_t_t <= 0: 
    11901197            self.bt_append_plot.Disable() 
    11911198            self.cb_plotpanel.Disable() 
     
    11961203            self.bt_append_plot.Enable() 
    11971204            self.cb_plotpanel.Enable() 
    1198              
     1205 
    11991206    def check_theory_to_freeze(self): 
    12001207        """ 
     
    12141221        else: 
    12151222            self.bt_freeze.Disable() 
    1216          
     1223 
    12171224    def enable_selection(self): 
    12181225        """ 
     
    12291236        else: 
    12301237            self.selection_cbox.Disable() 
    1231              
     1238 
    12321239    def show_data_button(self): 
    12331240        """ 
    1234         show load data and remove data button if  
     1241        show load data and remove data button if 
    12351242        dataloader on else hide them 
    12361243        """ 
     
    12381245            gui_style = self.parent.get_style() 
    12391246            style = gui_style & GUIFRAME.DATALOADER_ON 
    1240             if style == GUIFRAME.DATALOADER_ON:  
     1247            if style == GUIFRAME.DATALOADER_ON: 
    12411248                #self.bt_remove.Show(True) 
    1242                 self.bt_add.Show(True)  
     1249                self.bt_add.Show(True) 
    12431250            else: 
    12441251                #self.bt_remove.Hide() 
    12451252                self.bt_add.Hide() 
    1246         except:  
     1253        except: 
    12471254            #self.bt_remove.Hide() 
    1248             self.bt_add.Hide()  
    1249      
     1255            self.bt_add.Hide() 
     1256 
    12501257 
    12511258 
     
    12641271        self.list_of_ctrl = [] 
    12651272        if not data_list: 
    1266             return  
     1273            return 
    12671274        self._sizer_main = wx.BoxSizer(wx.VERTICAL) 
    12681275        self._sizer_txt = wx.BoxSizer(wx.VERTICAL) 
     
    12731280        self._panel.SetupScrolling() 
    12741281        self.__do_layout(data_list, text=text) 
    1275          
     1282 
    12761283    def __do_layout(self, data_list, text=''): 
    12771284        """ 
     
    12791286        """ 
    12801287        if not data_list or len(data_list) <= 1: 
    1281             return  
     1288            return 
    12821289        #add text 
    1283          
     1290 
    12841291        text = "Deleting these file reset some panels.\n" 
    12851292        text += "Do you want to proceed?\n" 
     
    13151322                                wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    13161323        static_line = wx.StaticLine(self, -1) 
    1317          
     1324 
    13181325        self._sizer_txt.Add(self._panel, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) 
    13191326        self._sizer_main.Add(self._sizer_txt, 1, wx.EXPAND|wx.ALL, 10) 
    1320         #self._sizer_main.Add(self._data_text_ctrl, 0,  
     1327        #self._sizer_main.Add(self._data_text_ctrl, 0, 
    13211328        #                     wx.EXPAND|wx.LEFT|wx.RIGHT, 10) 
    13221329        self._sizer_main.Add(static_line, 0, wx.EXPAND, 0) 
     
    13241331        self.SetSizer(self._sizer_main) 
    13251332        self.Layout() 
    1326          
     1333 
    13271334    def get_data(self): 
    13281335        """ 
     
    13351342                temp.append(data) 
    13361343        return temp 
    1337                 
     1344 
    13381345class DataFrame(wx.Frame): 
    13391346    """ 
     
    13471354    #  tied to any perspective 
    13481355    ALWAYS_ON = True 
    1349      
     1356 
    13501357    def __init__(self, parent=None, owner=None, manager=None, size=(300, 800), 
    13511358                         list_of_perspective=[], list=[], *args, **kwds): 
     
    13571364        self.owner = owner 
    13581365        self._manager = manager 
    1359         self.panel = DataPanel(parent=self,  
     1366        self.panel = DataPanel(parent=self, 
    13601367                               manager=manager, 
    13611368                               list_of_perspective=list_of_perspective) 
    1362       
     1369 
    13631370    def load_data_list(self, list=[]): 
    13641371        """ 
     
    13661373        """ 
    13671374        self.panel.load_data_list(list=list) 
    1368          
    1369     
    1370      
     1375 
     1376 
     1377 
    13711378from sas.sasgui.guiframe.dataFitting import Theory1D 
    13721379from sas.sasgui.guiframe.data_state import DataState 
     
    13831390        self.msg += "name  value\n" 
    13841391        return self.msg 
    1385      
     1392 
    13861393def set_data_state(data=None, path=None, theory=None, state=None): 
    13871394    """ 
     
    13911398    dstate.set_path(path=path) 
    13921399    dstate.set_theory(theory, state) 
    1393    
     1400 
    13941401    return dstate 
    1395      
     1402 
    13961403if __name__ == "__main__": 
    1397      
     1404 
    13981405    app = wx.App() 
    13991406    try: 
     
    14771484        #raise 
    14781485        print "error", sys.exc_value 
    1479          
    1480     app.MainLoop()   
    1481      
    1482      
     1486 
     1487    app.MainLoop() 
  • src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py

    rfaa3ae7 ra674d0b  
    162162            logging.error("Loader returned an invalid object:\n %s" % str(item)) 
    163163            data_error = True 
    164          
     164 
    165165        data = self.parent.create_gui_data(item, p_file) 
    166166        output[data.id] = data 
     
    170170        """ 
    171171        """ 
    172         message = "" 
    173         log_msg = '' 
     172        file_errors = {} 
    174173        output = {} 
    175         any_error = False 
    176         data_error = False 
    177         error_message = "" 
     174        exception_occurred = False 
     175 
    178176        for p_file in path: 
    179             info = "info" 
    180177            basename = os.path.basename(p_file) 
    181178            _, extension = os.path.splitext(basename) 
    182179            if extension.lower() in EXTENSIONS: 
    183                 any_error = True 
    184180                log_msg = "Data Loader cannot " 
    185                 log_msg += "load: %s\n" % str(p_file) 
    186                 log_msg += """Please try to open that file from "open project" """ 
    187                 log_msg += """or "open analysis" menu\n""" 
    188                 error_message = log_msg + "\n" 
     181                log_msg += "load: {}\n".format(str(p_file)) 
     182                log_msg += "Please try to open that file from \"open project\"" 
     183                log_msg += "or \"open analysis\" menu." 
    189184                logging.info(log_msg) 
     185                file_errors[basename] = [log_msg] 
    190186                continue 
    191187 
    192188            try: 
    193                 message = "Loading Data... " + str(p_file) + "\n" 
    194                 self.load_update(output=output, message=message, info=info) 
     189                message = "Loading {}...\n".format(p_file) 
     190                self.load_update(output=output, message=message, info="info") 
    195191                temp = self.loader.load(p_file, format) 
    196                 if temp.__class__.__name__ == "list": 
    197                     for item in temp: 
    198                         output, error_message, data_error = \ 
    199                             self._process_data_and_errors(item, 
    200                                                           p_file, 
    201                                                           output, 
    202                                                           error_message) 
    203                 else: 
     192                if not isinstance(temp, list): 
     193                    temp = [temp] 
     194                for item in temp: 
     195                    error_message = "" 
    204196                    output, error_message, data_error = \ 
    205                             self._process_data_and_errors(temp, 
    206                                                           p_file, 
    207                                                           output, 
    208                                                           error_message) 
     197                        self._process_data_and_errors(item, 
     198                                                      p_file, 
     199                                                      output, 
     200                                                      error_message) 
     201                    if data_error: 
     202                        if basename in file_errors.keys(): 
     203                            file_errors[basename] += [error_message] 
     204                        else: 
     205                            file_errors[basename] = [error_message] 
     206                        self.load_update(output=output, 
     207                            message=error_message, info="warning") 
     208 
     209                self.load_update(output=output, 
     210                message="Loaded {}\n".format(p_file), 
     211                info="info") 
     212 
    209213            except: 
    210214                logging.error(sys.exc_value) 
    211                 any_error = True 
    212             if any_error or error_message != "": 
    213                 if error_message == "": 
    214                     error = "Error: " + str(sys.exc_info()[1]) + "\n" 
    215                     error += "while loading Data: \n%s\n" % str(basename) 
    216                     error_message += "The data file you selected could not be loaded.\n" 
    217                     error_message += "Make sure the content of your file" 
    218                     error_message += " is properly formatted.\n\n" 
    219                     error_message += "When contacting the SasView team, mention the" 
    220                     error_message += " following:\n%s" % str(error) 
    221                 elif data_error: 
    222                     base_message = "Errors occurred while loading " 
    223                     base_message += "{0}\n".format(basename) 
    224                     base_message += "The data file loaded but with errors.\n" 
    225                     error_message = base_message + error_message 
    226                 else: 
    227                     error_message += "%s\n" % str(p_file) 
    228                 info = "error" 
    229          
    230         if any_error or error_message: 
    231             self.load_update(output=output, message=error_message, info=info) 
    232         else: 
    233             message = "Loading Data Complete! " 
    234         message += log_msg 
    235         self.load_complete(output=output, error_message=error_message, 
    236                            message=message, path=path, info='info') 
     215 
     216                error_message = "The Data file you selected could not be loaded.\n" 
     217                error_message += "Make sure the content of your file" 
     218                error_message += " is properly formatted.\n" 
     219                error_message += "When contacting the SasView team, mention the" 
     220                error_message += " following:\n" 
     221                error_message += "Error: " + str(sys.exc_info()[1]) 
     222                file_errors[basename] = [error_message] 
     223                self.load_update(output=output, message=error_message, info="warning") 
     224 
     225        if len(file_errors) > 0: 
     226            error_message = "" 
     227            for filename, error_array in file_errors.iteritems(): 
     228                error_message += "The following errors occured whilst " 
     229                error_message += "loading {}:\n".format(filename) 
     230                for message in error_array: 
     231                    error_message += message + "\n" 
     232                error_message += "\n" 
     233            self.load_update(output=output, message=error_message, info="error") 
     234 
     235        self.load_complete(output=output, message="Loading data complete!", 
     236            info="info") 
    237237 
    238238    def load_update(self, output=None, message="", info="warning"): 
     
    254254        #    self.load_error(error_message) 
    255255        self.parent.add_data(data_list=output) 
    256  
    257  
    258  
  • src/sas/sasgui/guiframe/local_perspectives/plotting/Plotter1D.py

    rd85c194 r895c9cb  
    527527            self.subplot.set_xlim((xlo, xhi)) 
    528528            self.subplot.set_ylim((ylo, yhi)) 
     529        self.graph.selected_plottable = None 
    529530 
    530531 
     
    555556        self._slicerpop.set_graph(self.graph) 
    556557        ids = iter(self._menu_ids) 
    557         if not self.graph.selected_plottable in self.plots: 
    558             # Various plot options 
    559             wx_id = ids.next() 
    560             self._slicerpop.Append(wx_id, '&Save Image', 'Save image as PNG') 
    561             wx.EVT_MENU(self, wx_id, self.onSaveImage) 
    562             wx_id = ids.next() 
    563             self._slicerpop.Append(wx_id, '&Print Image', 'Print image ') 
    564             wx.EVT_MENU(self, wx_id, self.onPrint) 
    565  
    566             wx_id = ids.next() 
    567             self._slicerpop.Append(wx_id, '&Copy to Clipboard', 
    568                                    'Copy to the clipboard') 
    569             wx.EVT_MENU(self, wx_id, self.OnCopyFigureMenu) 
    570  
    571             self._slicerpop.AppendSeparator() 
     558 
     559        # Various plot options 
     560        wx_id = ids.next() 
     561        self._slicerpop.Append(wx_id, '&Save Image', 'Save image as PNG') 
     562        wx.EVT_MENU(self, wx_id, self.onSaveImage) 
     563        wx_id = ids.next() 
     564        self._slicerpop.Append(wx_id, '&Print Image', 'Print image ') 
     565        wx.EVT_MENU(self, wx_id, self.onPrint) 
     566 
     567        wx_id = ids.next() 
     568        self._slicerpop.Append(wx_id, '&Copy to Clipboard', 
     569                               'Copy to the clipboard') 
     570        wx.EVT_MENU(self, wx_id, self.OnCopyFigureMenu) 
     571 
     572        self._slicerpop.AppendSeparator() 
    572573 
    573574        for plot in self.plots.values(): 
     
    592593            item_list = self.parent.get_current_context_menu(self) 
    593594            if (not item_list == None) and (not len(item_list) == 0): 
    594                 # Note: reusing menu ids in submenu.  This code works because 
    595                 # IdItems is set up as a lazy iterator returning each id in 
    596                 # sequence, creating new ids as needed so it never runs out. 
    597                 # zip() is set up to stop when any iterator is empty, so it 
    598                 # only asks for the number of ids in item_list. 
    599                 for item, wx_id in zip(item_list, self._menu_ids): 
     595                for item, wx_id in zip(item_list, [ids.next() for i in range(len(item_list))]): 
    600596 
    601597                    try: 
     
    609605 
    610606            if self.parent.ClassName.count('wxDialog') == 0: 
    611                 wx_id = ids.next() 
    612                 plot_menu.Append(wx_id, '&Linear Fit', name) 
    613                 wx.EVT_MENU(self, wx_id, self.onFitting) 
    614                 plot_menu.AppendSeparator() 
     607                if plot.id != 'fit': 
     608                    wx_id = ids.next() 
     609                    plot_menu.Append(wx_id, '&Linear Fit', name) 
     610                    wx.EVT_MENU(self, wx_id, self.onFitting) 
     611                    plot_menu.AppendSeparator() 
    615612 
    616613                wx_id = ids.next() 
     
    646643            # Option to hide 
    647644            # TODO: implement functionality to hide a plottable (legend click) 
    648         if not self.graph.selected_plottable in self.plots: 
     645 
     646        self._slicerpop.AppendSeparator() 
     647        loc_menu = wx.Menu() 
     648        for label in self._loc_labels: 
     649            wx_id = ids.next() 
     650            loc_menu.Append(wx_id, str(label), str(label)) 
     651            wx.EVT_MENU(self, wx_id, self.onChangeLegendLoc) 
     652 
     653        wx_id = ids.next() 
     654        self._slicerpop.Append(wx_id, '&Modify Graph Appearance', 
     655                               'Modify graph appearance') 
     656        wx.EVT_MENU(self, wx_id, self.modifyGraphAppearance) 
     657        self._slicerpop.AppendSeparator() 
     658 
     659 
     660        if self.position != None: 
     661            wx_id = ids.next() 
     662            self._slicerpop.Append(wx_id, '&Add Text') 
     663            wx.EVT_MENU(self, wx_id, self._on_addtext) 
     664            wx_id = ids.next() 
     665            self._slicerpop.Append(wx_id, '&Remove Text') 
     666            wx.EVT_MENU(self, wx_id, self._on_removetext) 
    649667            self._slicerpop.AppendSeparator() 
    650             loc_menu = wx.Menu() 
    651             for label in self._loc_labels: 
    652                 wx_id = ids.next() 
    653                 loc_menu.Append(wx_id, str(label), str(label)) 
    654                 wx.EVT_MENU(self, wx_id, self.onChangeLegendLoc) 
    655  
    656             wx_id = ids.next() 
    657             self._slicerpop.Append(wx_id, '&Modify Graph Appearance', 
    658                                    'Modify graph appearance') 
    659             wx.EVT_MENU(self, wx_id, self.modifyGraphAppearance) 
    660             self._slicerpop.AppendSeparator() 
    661  
    662  
    663             if self.position != None: 
    664                 wx_id = ids.next() 
    665                 self._slicerpop.Append(wx_id, '&Add Text') 
    666                 wx.EVT_MENU(self, wx_id, self._on_addtext) 
    667                 wx_id = ids.next() 
    668                 self._slicerpop.Append(wx_id, '&Remove Text') 
    669                 wx.EVT_MENU(self, wx_id, self._on_removetext) 
    670                 self._slicerpop.AppendSeparator() 
    671             wx_id = ids.next() 
    672             self._slicerpop.Append(wx_id, '&Change Scale') 
    673             wx.EVT_MENU(self, wx_id, self._onProperties) 
     668        wx_id = ids.next() 
     669        self._slicerpop.Append(wx_id, '&Change Scale') 
     670        wx.EVT_MENU(self, wx_id, self._onProperties) 
     671        self._slicerpop.AppendSeparator() 
     672        wx_id = ids.next() 
     673        self._slicerpop.Append(wx_id, '&Set Graph Range') 
     674        wx.EVT_MENU(self, wx_id, self.onSetRange) 
     675        wx_id = ids.next() 
     676        self._slicerpop.Append(wx_id, '&Reset Graph Range') 
     677        wx.EVT_MENU(self, wx_id, self.onResetGraph) 
     678 
     679        if self.parent.ClassName.count('wxDialog') == 0: 
    674680            self._slicerpop.AppendSeparator() 
    675681            wx_id = ids.next() 
    676             self._slicerpop.Append(wx_id, '&Reset Graph Range') 
    677             wx.EVT_MENU(self, wx_id, self.onResetGraph) 
    678  
    679             if self.parent.ClassName.count('wxDialog') == 0: 
    680                 self._slicerpop.AppendSeparator() 
    681                 wx_id = ids.next() 
    682                 self._slicerpop.Append(wx_id, '&Window Title') 
    683                 wx.EVT_MENU(self, wx_id, self.onChangeCaption) 
     682            self._slicerpop.Append(wx_id, '&Window Title') 
     683            wx.EVT_MENU(self, wx_id, self.onChangeCaption) 
    684684        try: 
    685685            pos_evt = event.GetPosition() 
     
    689689            pos = (pos_x, pos_y + 5) 
    690690        self.PopupMenu(self._slicerpop, pos) 
     691 
     692    def onSetRange(self, event): 
     693        # Display dialog 
     694        # self.subplot.set_xlim((low, high)) 
     695        # self.subplot.set_ylim((low, high)) 
     696        from sas.sasgui.plottools.RangeDialog import RangeDialog 
     697        d = RangeDialog(self, -1) 
     698        xlim = self.subplot.get_xlim() 
     699        ylim = self.subplot.get_ylim() 
     700        d.SetXRange(xlim) 
     701        d.SetYRange(ylim) 
     702        if d.ShowModal() == wx.ID_OK: 
     703            x_range = d.GetXRange() 
     704            y_range = d.GetYRange() 
     705            if x_range is not None and y_range is not None: 
     706                self.subplot.set_xlim(x_range) 
     707                self.subplot.set_ylim(y_range) 
     708                self.subplot.figure.canvas.draw_idle() 
     709        d.Destroy() 
    691710 
    692711    def onFreeze(self, event): 
     
    776795                                                             int(curr_symbol))), curr_label) 
    777796        self.appD.Bind(wx.EVT_CLOSE, self.on_AppDialog_close) 
     797        self.graph.selected_plottable = None 
    778798 
    779799    def on_AppDialog_close(self, event): 
  • src/sas/sasgui/guiframe/local_perspectives/plotting/Plotter2D.py

    rd85c194 r1a696bf  
    293293 
    294294        wx_id = ids.next() 
    295         slicerpop.Append(wx_id, '&Save Image') 
     295        slicerpop.Append(wx_id, '&Save Image', 'Save image as png') 
    296296        wx.EVT_MENU(self, wx_id, self.onSaveImage) 
    297297 
     
    320320            if (not item_list == None) and (not len(item_list) == 0) and\ 
    321321                self.data2D.name.split(" ")[0] != 'Residuals': 
    322                 # The line above; Not for trunk 
    323                 # Note: reusing menu ids for the sub-menus.  See Plotter1D. 
    324                 for item, wx_id in zip(item_list, self._menu_ids): 
     322                for item, wx_id in zip(item_list, [ids.next() for i in range(len(item_list))]): 
    325323                    try: 
    326324                        slicerpop.Append(wx_id, item[0], item[1]) 
  • src/sas/sasgui/guiframe/local_perspectives/plotting/SimplePlot.py

    rd85c194 r25b9707a  
    188188    """ 
    189189    def __init__(self, parent, id, title, scale='log_{10}', 
    190                  size=wx.Size(550, 470)): 
     190                 size=wx.Size(550, 470), show_menu_icons=True): 
    191191        """ 
    192192        comment 
     
    202202        self._default_save_location = None 
    203203        self.scale = scale 
     204        self._show_menu_icons = show_menu_icons 
    204205        self.plotpanel = SimplePlotPanel(self, -1) 
    205206        self._build_menubar() 
     
    213214        quit_bmp = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_TOOLBAR, tsize) 
    214215        print_bmp = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR, tsize) 
    215         preview_bmp = wx.ArtProvider.GetBitmap(wx.ART_REPORT_VIEW, wx.ART_TOOLBAR, tsize) 
    216216        copy_bmp = wx.ArtProvider.GetBitmap(wx.ART_COPY, wx.ART_TOOLBAR, tsize) 
    217217        menu_bar = wx.MenuBar() 
     
    219219        menu = wx.Menu() 
    220220        id = wx.NewId() 
    221         item = wx.MenuItem(menu, id, "&Save Image") 
    222         item.SetBitmap(save_bmp) 
    223         menu.AppendItem(item) 
     221        save_item = wx.MenuItem(menu, id, "&Save Image") 
     222        menu.AppendItem(save_item) 
    224223        wx.EVT_MENU(self, id, self.on_save_file) 
    225224 
    226225        id = wx.NewId() 
    227         item = wx.MenuItem(menu, id, "&Print Image") 
    228         item.SetBitmap(print_bmp) 
    229         menu.AppendItem(item) 
     226        print_item = wx.MenuItem(menu, id, "&Print Image") 
     227        menu.AppendItem(print_item) 
    230228        wx.EVT_MENU(self, id, self.on_print_image) 
    231229 
    232230        menu.AppendSeparator() 
    233231        id = wx.NewId() 
    234         item = wx.MenuItem(menu, id, "&Quit") 
    235         item.SetBitmap(quit_bmp) 
    236         menu.AppendItem(item) 
     232        quit_item = wx.MenuItem(menu, id, "&Quit") 
     233        menu.AppendItem(quit_item) 
    237234 
    238235        menu_bar.Append(menu, "&File") 
     
    241238        menu_edit = wx.Menu() 
    242239        id = wx.NewId() 
    243         item = wx.MenuItem(menu_edit, id, "&Copy") 
    244         item.SetBitmap(copy_bmp) 
    245         menu_edit.AppendItem(item) 
     240        copy_item = wx.MenuItem(menu_edit, id, "&Copy") 
     241        menu_edit.AppendItem(copy_item) 
    246242        wx.EVT_MENU(self, id, self.on_copy_image) 
     243 
     244        if self._show_menu_icons: 
     245            save_item.SetBitmap(save_bmp) 
     246            print_item.SetBitmap(print_bmp) 
     247            quit_item.SetBitmap(quit_bmp) 
     248            copy_item.SetBitmap(copy_bmp) 
    247249 
    248250        menu_bar.Append(menu_edit, "&Edit") 
     
    324326        except: 
    325327            self.Destroy() 
    326  
  • src/sas/sasgui/guiframe/media/data_explorer_help.rst

    rd85c194 rb64b87c  
    2020 
    2121*NOTE! When* Data Explorer *is hidden, all data loaded will be sent directly  
    22 to the current active analysis perspective, if possible. When* Data Explorer *is 
     22to the current active analysis, if possible. When* Data Explorer *is 
    2323shown, data go first to the* Data Explorer. 
    2424 
     
    116116 
    117117Click on the *Send To* button to send the currently selected data to one of the 
    118 perspectives (for *Fitting*, *P(r) Inversion*, or *Invariant* calculation). 
     118available types of analysis (*Fitting*, *P(r) Inversion*, or *Invariant* calculation). 
    119119  
    120 The *Single*/*Batch* mode radio buttons only apply to the *Fitting* perspective. 
     120The *Single*/*Batch* mode radio buttons only apply to *Fitting*. 
    121121 
    122122*Batch mode* provides serial (batch) fitting with one model function, that is,  
  • src/sas/sasgui/guiframe/media/graph_help.rst

    rf93b473f r318427a9  
    9494*  PNG (portable network graphics) 
    9595*  PS (postscript) 
    96 *  RAW/RGBA (bitmap) 
     96*  RAW/RGBA (bitmap, stored as 935x635 pixels of depth 8) 
    9797*  SVG/SVGA (scalable vector graphics) 
    9898*  TIF/TIFF (tagged iamge file) 
     99 
     100The PGF image type option requires a LaTeX compiler: xelatex (default),  
     101lualatex, or pdflatex. These are not shipped with SasView. 
    99102 
    100103Printing a plot 
  • src/sas/sasgui/perspectives/calculator/data_operator.py

    re871a2d r0e760e9  
    1515from sas.sasgui.guiframe.documentation_window import DocumentationWindow 
    1616 
    17 #Control panel width  
     17#Control panel width 
    1818if sys.platform.count("win32") > 0: 
    1919    PANEL_TOP = 0 
     
    156156 
    157157        wx.EVT_TEXT_ENTER(self.data_namectr, -1, self.on_name) 
    158         wx.EVT_TEXT_ENTER(self.numberctr, -1, self.on_number) 
     158        wx.EVT_TEXT(self.numberctr, -1, self.on_number) 
    159159        wx.EVT_COMBOBOX(self.data1_cbox, -1, self.on_select_data1) 
    160160        wx.EVT_COMBOBOX(self.operator_cbox, -1, self.on_select_operator) 
     
    235235        self.name_sizer.Layout() 
    236236 
    237     def on_number(self, event=None): 
     237    def on_number(self, event=None, control=None): 
    238238        """ 
    239239        On selecting Number for Data2 
    240240        """ 
    241241        self.send_warnings('') 
    242         item = event.GetEventObject() 
     242        item = control 
     243        if item is None and event is not None: 
     244            item = event.GetEventObject() 
     245        elif item is None: 
     246            raise ValueError("Event or control must be supplied") 
    243247        text = item.GetValue().strip() 
    244248        if self.numberctr.IsShown(): 
     
    251255                except: 
    252256                    self._set_textctrl_color(self.numberctr, 'pink') 
    253                     msg = "DataOperation: Number requires a float number." 
    254                     self.send_warnings(msg, 'error') 
    255                     return 
     257                    if event is None: 
     258                        msg = "DataOperation: Number requires a float number." 
     259                        self.send_warnings(msg, 'error') 
     260                    return False 
    256261            else: 
    257262                self._set_textctrl_color(self.numberctr, self.color) 
     
    263268        self.draw_output(self.output) 
    264269        self.Refresh() 
     270        return True 
    265271 
    266272    def on_select_data1(self, event=None): 
     
    607613            wx.MessageBox(msg, 'Error') 
    608614            return 
     615        if self.numberctr.IsEnabled() and self.numberctr.IsShown(): 
     616            valid_num = self.on_number(control=self.numberctr) 
     617            if not valid_num: 
     618                return 
    609619        # send data to data manager 
    610620        self.output.name = name 
     
    731741        #add plot 
    732742        self.graph.add(plot) 
    733         #draw         
     743        #draw 
    734744        self.graph.render(self) 
    735745 
     
    985995    window = DataOperatorWindow(parent=None, data=[], title="Data Editor") 
    986996    app.MainLoop() 
    987  
  • src/sas/sasgui/perspectives/calculator/image_viewer.py

    rd0248bd r25b9707a  
    7373                    parent.put_icon(plot_frame) 
    7474            except: 
    75                 print "parent", parent 
    7675                err_msg += "Failed to load '%s'.\n" % basename 
    7776        if err_msg: 
     
    109108        """ 
    110109        # Initialize the Frame object 
    111         PlotFrame.__init__(self, parent, id, title, scale, size) 
     110        PlotFrame.__init__(self, parent, id, title, scale, size, 
     111            show_menu_icons=False) 
    112112        self.parent = parent 
    113113        self.data = image 
     
    437437    ImageView(None).load() 
    438438    app.MainLoop() 
    439  
  • src/sas/sasgui/perspectives/fitting/basepage.py

    r5213d22 re4c897b  
    29422942        """ 
    29432943 
    2944         _TreeLocation = "user/sasgui/perspectives/fitting/mag_help.html" 
     2944        _TreeLocation = "user/magnetism.html" 
    29452945        _doc_viewer = DocumentationWindow(self, wx.ID_ANY, _TreeLocation, "", 
    29462946                                          "Polarized Beam/Magnetc Help") 
  • src/sas/sasgui/perspectives/fitting/media/fitting_help.rst

    r20846be rb64b87c  
    1515 
    1616 
    17 Fitting Perspective 
    18 =================== 
     17Fitting 
     18======= 
    1919 
    2020.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    2424 
    2525To fit some data you must first load some data, activate one or more data sets, 
    26 send those data sets to the fitting perspective, and select a model to fit to 
    27 each data set. 
     26send those data sets to fitting, and select a model to fit to each data set. 
    2827 
    2928Instructions on how to load and activate data are in the section :ref:`Loading_data`. 
     
    331330This mode fits one data set. 
    332331 
    333 When data is sent to the fitting perspective it is plotted in a graph window as 
    334 markers. 
     332When data is sent to the fitting it is plotted in a graph window as markers. 
    335333 
    336334If a graph does not appear, or a graph window appears but is empty, then the data 
  • src/sas/sasgui/perspectives/fitting/media/pd_help.rst

    r7805458 rb64b87c  
    105105 
    106106The median value for the distribution will be the value given for the respective 
    107 size parameter in the *Fitting Perspective*, for example, radius = 60. 
     107size parameter in the *FitPage*, for example, radius = 60. 
    108108 
    109109The polydispersity is given by |sigma| 
     
    172172 
    173173SasView only uses these array values during the computation, therefore any mean 
    174 value of the parameter represented by *x* present in the *Fitting Perspective* 
     174value of the parameter represented by *x* present in the *FitPage* 
    175175will be ignored. 
    176176 
  • src/sas/sasgui/perspectives/invariant/media/invariant_help.rst

    r70305bd2 rb64b87c  
    44.. by S King, ISIS, during SasView CodeCamp-III in Feb 2015. 
    55 
    6 Invariant Calculation Perspective 
    7 ================================= 
     6Invariant Calculation 
     7===================== 
    88 
    99Description 
     
    4545.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    4646 
    47 Using the perspective 
    48 --------------------- 
     47Using invariant analysis 
     48------------------------ 
    4949 
    50501) Select *Invariant* from the *Analysis* menu on the SasView toolbar. 
     
    5353 
    54543) Select a dataset and use the *Send To* button on the *Data Explorer* to load  
    55    the dataset into the *Invariant* perspective. 
     55   the dataset into the *Invariant* panel. 
    5656 
    57 4) Use the *Customised Input* boxes on the *Invariant* perspective to subtract  
     574) Use the *Customised Input* boxes on the *Invariant* panel to subtract  
    5858   any background, specify the contrast (i.e. difference in SLDs - this must be  
    5959   specified for the eventual value of Q*\  to be on an absolute scale), or to  
     
    7373 
    74748) If the value of Q*\  calculated with the extrapolated regions is invalid, a  
    75    red warning will appear at the top of the *Invariant* perspective panel. 
     75   red warning will appear at the top of the *Invariant* panel. 
    7676 
    7777   The details of the calculation are available by clicking the *Details*  
  • src/sas/sasgui/perspectives/pr/media/pr_help.rst

    r7805458 rb64b87c  
    44.. by S King, ISIS, during SasView CodeCamp-III in Feb 2015. 
    55 
    6 P(r) Inversion Perspective 
    7 ========================== 
     6P(r) Calculation 
     7================ 
    88 
    99Description 
     
    3232.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    3333 
    34 Using the perspective 
    35 --------------------- 
     34Using P(r) inversion 
     35-------------------- 
    3636 
    3737The user must enter 
  • src/sas/sasgui/plottools/PlotPanel.py

    rdd5bf63 r1a8e2e8e  
    1515import os 
    1616import transform 
    17 from plottables import Data1D 
    1817#TODO: make the plottables interactive 
    1918from binder import BindArtist 
     
    151150        #List of texts currently on the plot 
    152151        self.textList = [] 
     152        self.selectedText = None 
    153153        #User scale 
    154154        if xtransform != None: 
     
    190190 
    191191        # new data for the fit 
     192        from sas.sasgui.guiframe.dataFitting import Data1D 
    192193        self.fit_result = Data1D(x=[], y=[], dy=None) 
    193194        self.fit_result.symbol = 13 
     
    352353            self.leftdown = True 
    353354            ax = event.inaxes 
     355            for text in self.textList: 
     356                if text.contains(event)[0]: # If user has clicked on text 
     357                    self.selectedText = text 
     358                    return 
     359 
    354360            if ax != None: 
    355361                self.xInit, self.yInit = event.xdata, event.ydata 
     
    373379            self.mousemotion = False 
    374380            self.leftup = True 
     381            self.selectedText = None 
    375382 
    376383        #release the legend 
     
    448455            self._on_legend_motion(event) 
    449456            return 
     457 
     458        if self.leftdown and self.selectedText is not None: 
     459            # User has clicked on text and is dragging 
     460            ax = event.inaxes 
     461            if ax != None: 
     462                # Only move text if mouse is within axes 
     463                self.selectedText.set_position((event.xdata, event.ydata)) 
     464                self._dragHelper(0, 0) 
     465            else: 
     466                # User has dragged outside of axes 
     467                self.selectedText = None 
     468            return 
     469 
    450470        if self.enable_toolbar: 
    451471            #Disable dragging without the toolbar to allow zooming with toolbar 
     
    646666                dlg.setFitRange(self.xminView, self.xmaxView, 
    647667                                self.xmin, self.xmax) 
     668            else: 
     669                xlim = self.subplot.get_xlim() 
     670                ylim = self.subplot.get_ylim() 
     671                dlg.setFitRange(xlim[0], xlim[1], ylim[0], ylim[1]) 
    648672            # It would be nice for this to NOT be modal (i.e. Show). 
    649673            # Not sure about other ramifications - for example 
     
    713737                if dial.ShowModal() == wx.ID_OK: 
    714738                    self.xLabel, self.yLabel, self.viewModel = dial.getValues() 
    715                     if self.viewModel == "Linear y vs x": 
    716                         self.xLabel = "x" 
    717                         self.yLabel = "y" 
    718                         self.viewModel = "--" 
    719                         dial.setValues(self.xLabel, self.yLabel, self.viewModel) 
    720                     if self.viewModel == "Guinier lny vs x^(2)": 
    721                         self.xLabel = "x^(2)" 
    722                         self.yLabel = "ln(y)" 
    723                         self.viewModel = "--" 
    724                         dial.setValues(self.xLabel, self.yLabel, self.viewModel) 
    725                     if self.viewModel == "XS Guinier ln(y*x) vs x^(2)": 
    726                         self.xLabel = "x^(2)" 
    727                         self.yLabel = "ln(y*x)" 
    728                         self.viewModel = "--" 
    729                         dial.setValues(self.xLabel, self.yLabel, self.viewModel) 
    730                     if self.viewModel == "Porod y*x^(4) vs x^(4)": 
    731                         self.xLabel = "x^(4)" 
    732                         self.yLabel = "y*x^(4)" 
    733                         self.viewModel = "--" 
    734                         dial.setValues(self.xLabel, self.yLabel, self.viewModel) 
    735739                    self._onEVT_FUNC_PROPERTY() 
    736740                dial.Destroy() 
     
    12111215 
    12121216        # Properties defined by plot 
    1213          
     1217 
    12141218        # Ricardo: 
    1215         # A empty label "$$" will prevent the panel from displaying!  
    1216          
     1219        # A empty label "$$" will prevent the panel from displaying! 
    12171220        if prop["xlabel"]: 
    12181221            self.subplot.set_xlabel(r"$%s$"%prop["xlabel"]) 
     
    12201223            self.subplot.set_ylabel(r"$%s$"%prop["ylabel"]) 
    12211224        self.subplot.set_title(prop["title"]) 
    1222          
     1225 
    12231226 
    12241227    def clear(self): 
     
    15641567                                                  bins=[self.y_bins, self.x_bins], 
    15651568                                                  weights=self.data) 
    1566         # Now, normalize the image by weights only for weights>1:  
     1569        # Now, normalize the image by weights only for weights>1: 
    15671570        # If weight == 1, there is only one data point in the bin so 
    15681571        # that no normalization is required. 
     
    17461749        if remove_fit: 
    17471750            self.graph.delete(self.fit_result) 
     1751            if hasattr(self, 'plots'): 
     1752                if 'fit' in self.plots.keys(): 
     1753                    del self.plots['fit'] 
    17481754        self.ly = None 
    17491755        self.q_ctrl = None 
     
    17591765        _yscale = 'linear' 
    17601766        for item in list: 
     1767            if item.id == 'fit': 
     1768                continue 
    17611769            item.setLabel(self.xLabel, self.yLabel) 
    1762  
    17631770            # control axis labels from the panel itself 
    17641771            yname, yunits = item.get_yaxis() 
     
    17901797            if self.xLabel == "ln(x)": 
    17911798                item.transformX(transform.toLogX, transform.errToLogX) 
    1792                 self.graph._xaxis_transformed("\ln\\ %s" % xname, "%s" % xunits) 
     1799                self.graph._xaxis_transformed("\ln{(%s)}" % xname, "%s" % xunits) 
    17931800            if self.xLabel == "log10(x)": 
    17941801                item.transformX(transform.toX_pos, transform.errToX_pos) 
     
    18021809            if self.yLabel == "ln(y)": 
    18031810                item.transformY(transform.toLogX, transform.errToLogX) 
    1804                 self.graph._yaxis_transformed("\ln\\ %s" % yname, "%s" % yunits) 
     1811                self.graph._yaxis_transformed("\ln{(%s)}" % yname, "%s" % yunits) 
    18051812            if self.yLabel == "y": 
    18061813                item.transformY(transform.toX, transform.errToX) 
     
    18181825                yunits = convert_unit(-1, yunits) 
    18191826                self.graph._yaxis_transformed("1/%s" % yname, "%s" % yunits) 
     1827            if self.yLabel == "y*x^(2)": 
     1828                item.transformY(transform.toYX2, transform.errToYX2) 
     1829                xunits = convert_unit(2, self.xaxis_unit) 
     1830                self.graph._yaxis_transformed("%s \ \ %s^{2}" % (yname, xname), 
     1831                                              "%s%s" % (yunits, xunits)) 
    18201832            if self.yLabel == "y*x^(4)": 
    18211833                item.transformY(transform.toYX4, transform.errToYX4) 
     
    18311843            if self.yLabel == "ln(y*x)": 
    18321844                item.transformY(transform.toLogXY, transform.errToLogXY) 
    1833                 self.graph._yaxis_transformed("\ln (%s \ \ %s)" % (yname, xname), 
     1845                self.graph._yaxis_transformed("\ln{(%s \ \ %s)}" % (yname, xname), 
    18341846                                              "%s%s" % (yunits, self.xaxis_unit)) 
    18351847            if self.yLabel == "ln(y*x^(2))": 
     
    18491861                self.graph._yaxis_transformed("%s \ \ %s^{4}" % (yname, xname), 
    18501862                                              "%s%s" % (yunits, xunits)) 
    1851             if self.viewModel == "Guinier lny vs x^(2)": 
    1852                 item.transformX(transform.toX2, transform.errToX2) 
    1853                 xunits = convert_unit(2, xunits) 
    1854                 self.graph._xaxis_transformed("%s^{2}" % xname, "%s" % xunits) 
    1855                 item.transformY(transform.toLogX, transform.errToLogX) 
    1856                 self.graph._yaxis_transformed("\ln\ \ %s" % yname, "%s" % yunits) 
    1857             if self.viewModel == "Porod y*x^(4) vs x^(4)": 
    1858                 item.transformX(transform.toX4, transform.errToX4) 
    1859                 xunits = convert_unit(4, self.xaxis_unit) 
    1860                 self.graph._xaxis_transformed("%s^{4}" % xname, "%s" % xunits) 
    1861                 item.transformY(transform.toYX4, transform.errToYX4) 
    1862                 self.graph._yaxis_transformed("%s \ \ %s^{4}" % (yname, xname), 
    1863                                               "%s%s" % (yunits, xunits)) 
    18641863            item.transformView() 
    18651864 
     
    18991898 
    19001899        """ 
     1900        xlim = self.subplot.get_xlim() 
     1901        ylim = self.subplot.get_ylim() 
     1902 
    19011903        # Saving value to redisplay in Fit Dialog when it is opened again 
    19021904        self.Avalue, self.Bvalue, self.ErrAvalue, \ 
     
    19221924        self.graph.render(self) 
    19231925        self._offset_graph() 
     1926        if hasattr(self, 'plots'): 
     1927            # Used by Plotter1D 
     1928            fit_id = 'fit' 
     1929            self.fit_result.id = fit_id 
     1930            self.fit_result.title = 'Fit' 
     1931            self.fit_result.name = 'Fit' 
     1932            self.plots[fit_id] = self.fit_result 
     1933        self.subplot.set_xlim(xlim) 
     1934        self.subplot.set_ylim(ylim) 
    19241935        self.subplot.figure.canvas.draw_idle() 
    19251936 
  • src/sas/sasgui/plottools/PropertyDialog.py

    r3409a90 r5129686  
    2323        iy += 1 
    2424        ix = 1 
    25         self.xvalue = wx.ComboBox(self, -1) 
     25        self.xvalue = wx.ComboBox(self, -1, style=wx.CB_READONLY) 
    2626        x_size += self.xvalue.GetSize()[0] 
    27         sizer.Add(self.xvalue, (iy, ix), (1, 1), wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     27        sizer.Add(self.xvalue, (iy, ix), (1, 1), wx.ADJUST_MINSIZE, 0) 
    2828 
    2929        ix += 2 
    30         self.yvalue = wx.ComboBox(self, -1) 
     30        self.yvalue = wx.ComboBox(self, -1, style=wx.CB_READONLY) 
    3131        x_size += self.yvalue.GetSize()[0] 
    32         sizer.Add(self.yvalue, (iy, ix), (1, 1), wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     32        sizer.Add(self.yvalue, (iy, ix), (1, 1), wx.ADJUST_MINSIZE, 0) 
    3333 
    3434        ix += 2 
    35         self.view = wx.ComboBox(self, -1) 
     35        self.view = wx.ComboBox(self, -1, style=wx.CB_READONLY) 
     36        self.view.Bind(wx.EVT_COMBOBOX, self.viewChanged) 
    3637        x_size += self.view.GetSize()[0] 
    3738        self.view.SetMinSize((160, 30)) 
     
    6465        self.yvalue.Insert("ln(y)", 2) 
    6566        self.yvalue.Insert("y^(2)", 3) 
    66         self.yvalue.Insert("y*x^(4)", 4) 
    67         self.yvalue.Insert("1/sqrt(y)", 5) 
    68         self.yvalue.Insert("log10(y)", 6) 
    69         self.yvalue.Insert("ln(y*x)", 7) 
    70         self.yvalue.Insert("ln(y*x^(2))", 8) 
    71         self.yvalue.Insert("ln(y*x^(4))", 9) 
    72         self.yvalue.Insert("log10(y*x^(4))", 10) 
     67        self.yvalue.Insert("y*x^(2)", 4) 
     68        self.yvalue.Insert("y*x^(4)", 5) 
     69        self.yvalue.Insert("1/sqrt(y)", 6) 
     70        self.yvalue.Insert("log10(y)", 7) 
     71        self.yvalue.Insert("ln(y*x)", 8) 
     72        self.yvalue.Insert("ln(y*x^(2))", 9) 
     73        self.yvalue.Insert("ln(y*x^(4))", 10) 
     74        self.yvalue.Insert("log10(y*x^(4))", 11) 
    7375        # type of view or model used 
    7476        self.view.SetValue("--") 
     
    7880        self.view.Insert("XS Guinier ln(y*x) vs x^(2)", 3) 
    7981        self.view.Insert("Porod y*x^(4) vs x^(4)", 4) 
    80         # This did not work in 3.1.2 and does not work now. 
    81         # prefer to fix (should not be too hard) but for the moment 
    82         # am removing as an option the user sees so they don't get 
    83         # disappointed.    PDB 7/10/2016  
    84         # self.view.Insert("Kratky y*x^(2) vs x", 5) 
     82        self.view.Insert("Kratky y*x^(2) vs x", 5) 
    8583        self.SetSizer(vbox) 
    8684        self.Fit() 
    8785        self.Centre() 
     86 
     87    def viewChanged(self, event): 
     88        event.Skip() 
     89        view = self.view.GetValue() 
     90        if view == "Linear y vs x": 
     91            self.xvalue.SetValue("x") 
     92            self.yvalue.SetValue("y") 
     93        elif view == "Guinier lny vs x^(2)": 
     94            self.xvalue.SetValue("x^(2)") 
     95            self.yvalue.SetValue("ln(y)") 
     96        elif view == "XS Guinier ln(y*x) vs x^(2)": 
     97            self.xvalue.SetValue("x^(2)") 
     98            self.yvalue.SetValue("ln(y*x)") 
     99        elif view == "Porod y*x^(4) vs x^(4)": 
     100            self.xvalue.SetValue("x^(4)") 
     101            self.yvalue.SetValue("y*x^(4)") 
     102        elif view == "Kratky y*x^(2) vs x": 
     103            self.xvalue.SetValue("x") 
     104            self.yvalue.SetValue("y*x^(2)") 
    88105 
    89106    def setValues(self, x, y, view): 
  • src/sas/sasgui/plottools/transform.py

    rd7bb526 r8abd96d  
    291291 
    292292 
    293 def errToYX2(x, y, dx=None, dy=None): 
     293def errToYX2(y, x, dy=None, dx=None): 
    294294    """ 
    295295    """ 
     
    325325 
    326326 
    327 def errToLogYX2(x, y, dx=None, dy=None): 
     327def errToLogYX2(y, x, dy=None, dx=None): 
    328328    """ 
    329329    calculate error of Log(yx**2) 
     
    375375 
    376376 
    377 def errToLogYX4(x, y=None, dx=None, dy=None): 
     377def errToLogYX4(y, x, dy=None, dx=None): 
    378378    """ 
    379379    error for ln(y*x^(4)) 
     
    396396 
    397397 
    398 def errToYX4(x, y=None, dx=None, dy=None): 
     398def errToYX4(y, x, dy=None, dx=None): 
    399399    """ 
    400400    error for (y*x^(4)) 
  • src/sas/sascalc/dataloader/readers/cansas_reader.py

    r83b6408 rfcba29a  
    957957            written = written | self.write_node(pix, "z", item.pixel_size.z, 
    958958                                                {"unit": item.pixel_size_unit}) 
    959             written = written | self.write_node(det, "slit_length", 
    960                                                 item.slit_length, 
    961                                                 {"unit": item.slit_length_unit}) 
    962959            if written == True: 
    963960                self.append(pix, det) 
     961            self.write_node(det, "slit_length", item.slit_length, 
     962                {"unit": item.slit_length_unit}) 
     963 
    964964 
    965965    def _write_process_notes(self, datainfo, entry_node): 
Note: See TracChangeset for help on using the changeset viewer.