Changeset 00077cf in sasview


Ignore:
Timestamp:
Aug 2, 2018 6:10:36 AM (3 weeks ago)
Author:
tcbennun
Branches:
ESS_GUI_beta_approx
Children:
41e3f36
Parents:
0f959ef (diff), 14acf92 (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 'ESS_GUI' into ESS_GUI_beta_approx

Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r4f80a83 r00077cf  
    149149        item.append([item1, item2, item4, item5, item6]) 
    150150    return item 
     151 
     152def markParameterDisabled(model, row): 
     153    """Given the QModel row number, format to show it is not available for fitting""" 
     154 
     155    # If an error column is present, there are a total of 6 columns. 
     156    items = [model.item(row, c) for c in range(6)] 
     157 
     158    model.blockSignals(True) 
     159 
     160    for item in items: 
     161        if item is None: 
     162            continue 
     163        item.setEditable(False) 
     164        item.setCheckable(False) 
     165 
     166    item = items[0] 
     167 
     168    font = QtGui.QFont() 
     169    font.setItalic(True) 
     170    item.setFont(font) 
     171    item.setForeground(QtGui.QBrush(QtGui.QColor(100, 100, 100))) 
     172    item.setToolTip("This parameter cannot be fitted.") 
     173 
     174    model.blockSignals(False) 
    151175 
    152176def addCheckedListToModel(model, param_list): 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r548f8e2 r00077cf  
    1515from PyQt5 import QtWidgets 
    1616 
    17 from sasmodels import product 
    1817from sasmodels import generate 
    1918from sasmodels import modelinfo 
    2019from sasmodels.sasview_model import load_standard_models 
     20from sasmodels.sasview_model import MultiplicationModel 
    2121from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS 
    2222 
     
    781781        """ 
    782782        if self.isCheckable(row): 
    783             item = self._model_model.item(row, 1) 
    784783            try: 
     784                item = self._model_model.item(row, 1) 
    785785                return item.child(0).data() 
    786786            except AttributeError: 
    787787                # return none when no constraints 
    788                 pass 
    789         return None 
     788                return None 
    790789 
    791790    def rowHasConstraint(self, row): 
     
    14211420        param_dict = self.paramDictFromResults(res) 
    14221421 
     1422        if param_dict is None: 
     1423            return 
     1424 
    14231425        elapsed = result[1] 
    14241426        if self.calc_fit._interrupting: 
     
    16591661            Take func and throw it inside the magnet model row loop 
    16601662            """ 
    1661             for row_i in range(self._model_model.rowCount()): 
    1662                 if self.isCheckable(row_i): 
    1663                     func(row_i) 
     1663            for row_i in range(self._magnet_model.rowCount()): 
     1664                func(row_i) 
    16641665 
    16651666        def updateFittedValues(row): 
     
    19871988        structure_module = generate.load_kernel_module(structure_factor) 
    19881989        structure_parameters = modelinfo.make_parameter_table(getattr(structure_module, 'parameters', [])) 
     1990 
    19891991        structure_kernel = self.models[structure_factor]() 
    1990  
    1991         self.kernel_module._model_info = product.make_product_info(self.kernel_module._model_info, structure_kernel._model_info) 
     1992        form_kernel = self.kernel_module 
     1993 
     1994        self.kernel_module = MultiplicationModel(form_kernel, structure_kernel) 
    19921995 
    19931996        # Get new rows for QModel 
     
    20002003        for row in new_rows: 
    20012004            self._model_model.appendRow(row) 
     2005            # disable fitting of parameters not listed in self.kernel_module (probably radius_effective) 
     2006            if row[0].text() not in self.kernel_module.params.keys(): 
     2007                row_num = self._model_model.rowCount() - 1 
     2008                FittingUtilities.markParameterDisabled(self._model_model, row_num) 
     2009 
    20022010        # Update the counter used for multishell display 
    20032011        self._last_model_row = self._model_model.rowCount() 
  • src/sas/qtgui/Perspectives/Fitting/ReportPageLogic.py

    r30bc96eb r5330be2  
    44import re 
    55import sys 
     6import tempfile 
     7 
    68import logging 
    79from io import BytesIO 
     
    911 
    1012from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
    11  
    12 from sas.qtgui.Plotting.Plotter import Plotter 
    13 from sas.qtgui.Plotting.Plotter2D import Plotter2D 
    14 from sas.qtgui.Plotting.PlotterData import Data1D 
    15 from sas.qtgui.Plotting.PlotterData import Data2D 
    1613 
    1714import sas.qtgui.Utilities.GuiUtils as GuiUtils 
     
    10299            canvas = FigureCanvas(fig) 
    103100            png_output = BytesIO() 
    104             canvas.print_png(png_output) 
    105             data = png_output.getvalue() 
    106             data64 = base64.b64encode(data) 
     101 
     102            # Create a "safe" location - system tmp 
     103            tmp_file = tempfile.TemporaryFile(suffix=".png") 
     104            try: 
     105                fig.savefig(tmp_file.name, dpi=75) 
     106                fig.savefig(png_output, dpi=75) 
     107            except PermissionError: 
     108                # sometimes one gets "permission denied" for temp files 
     109                # mainly on Windows 7 *gasp*. Let's try local directory 
     110                tmp_file = open("_tmp.png", "w+") 
     111                try: 
     112                    fig.savefig(tmp_file.name, dpi=75) 
     113                    fig.savefig(png_output, dpi=75) 
     114                except Exception as ex: 
     115                    logging.error("Creating of the report failed: %s"%str(ex)) 
     116                    return 
     117 
     118            data_to_print = png_output.getvalue() == open(tmp_file.name, 'rb').read() 
     119            tmp_file.close() 
     120            data64 = base64.b64encode(png_output.getvalue()) 
    107121            data_to_print = urllib.parse.quote(data64) 
    108             feet=FEET_2 
     122 
     123            feet = FEET_2 
    109124            if sys.platform == "darwin":  # Mac 
    110125                feet = FEET_3 
     
    153168        if not modelname or self._index is None: 
    154169            return None 
    155         plots = GuiUtils.plotsFromModel(modelname, self._index) 
    156         # Call show on requested plots 
    157         # All same-type charts in one plot 
    158         for plot_set in plots: 
    159             if isinstance(plot_set, Data1D): 
    160                 if 'residuals' in plot_set.title.lower(): 
    161                     res_plot = Plotter(self, quickplot=True) 
    162                     res_plot.plot(plot_set) 
    163                     graphs.append(res_plot.figure) 
    164                     continue 
    165                 if not 'new_plot' in locals(): 
    166                     new_plot = Plotter(self, quickplot=True) 
    167                 new_plot.plot(plot_set) 
    168             elif isinstance(plot_set, Data2D): 
    169                 plot2D = Plotter2D(self, quickplot=True) 
    170                 plot2D.item = self._index 
    171                 plot2D.plot(plot_set) 
    172                 graphs.append(plot2D.figure) 
    173  
    174             else: 
    175                 msg = "Incorrect data type passed to Plotting" 
    176                 raise AttributeError(msg) 
    177  
    178         if 'new_plot' in locals() and isinstance(new_plot.data, Data1D): 
    179             graphs.append(new_plot.figure) 
     170        plot_ids = [plot.id for plot in GuiUtils.plotsFromModel(modelname, self._index)] 
     171 
     172        # Active plots 
     173        import sas.qtgui.Plotting.PlotHelper as PlotHelper 
     174        shown_plot_names = PlotHelper.currentPlots() 
     175 
     176        # current_plots = list of graph names of currently shown plots 
     177        # which are related to this dataset 
     178        current_plots = [name for name in shown_plot_names if PlotHelper.plotById(name).data.id in plot_ids] 
     179 
     180        for name in current_plots: 
     181            # get the plotter object first 
     182            plotter = PlotHelper.plotById(name) 
     183            graphs.append(plotter.figure) 
    180184 
    181185        return graphs 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    r0f959ef r00077cf  
    6868 
    6969            painter.save() 
    70             painter.translate(textRect.topLeft()) 
    71             painter.setClipRect(textRect.translated(-textRect.topLeft())) 
     70            rect = textRect.topLeft() 
     71            x = rect.x() 
     72            y = rect.y() 
     73            x += 3.0 # magic value for rendering nice display in the table 
     74            y += 2.0 # magic value for rendering nice display in the table 
     75            rect.setX(x) 
     76            rect.setY(y) 
     77            painter.translate(rect) 
     78            painter.setClipRect(textRect.translated(-rect)) 
    7279            # Draw the QTextDocument in the cell 
    7380            doc.documentLayout().draw(painter, context) 
     
    184191            # Prepare document for inserting into cell 
    185192            doc = QtGui.QTextDocument() 
    186  
     193            current_font = painter.font() 
     194            doc.setDefaultFont(current_font) 
    187195            # Convert the unit description into HTML 
    188196            text_html = GuiUtils.convertUnitToHTML(str(options.text)) 
     
    195203            context = QtGui.QAbstractTextDocumentLayout.PaintContext() 
    196204            textRect = style.subElementRect(QtWidgets.QStyle.SE_ItemViewItemText, options) 
    197  
    198205            painter.save() 
    199             painter.translate(textRect.topLeft()) 
    200             painter.setClipRect(textRect.translated(-textRect.topLeft())) 
     206 
     207            rect = textRect.topLeft() 
     208            y = rect.y() 
     209            y += 5.0 # magic value for rendering nice display in the table 
     210            rect.setY(y) 
     211            painter.translate(rect) 
     212            painter.setClipRect(textRect.translated(-rect)) 
    201213            # Draw the QTextDocument in the cell 
    202214            doc.documentLayout().draw(painter, context) 
     
    262274            # Prepare document for inserting into cell 
    263275            doc = QtGui.QTextDocument() 
    264  
     276            current_font = painter.font() 
     277            doc.setDefaultFont(current_font) 
    265278            # Convert the unit description into HTML 
    266279            text_html = GuiUtils.convertUnitToHTML(str(options.text)) 
     
    275288 
    276289            painter.save() 
    277             painter.translate(textRect.topLeft()) 
    278             painter.setClipRect(textRect.translated(-textRect.topLeft())) 
     290            rect = textRect.topLeft() 
     291            y = rect.y() 
     292            y += 5.0 # magic value for rendering nice display in the table 
     293            rect.setY(y) 
     294            painter.translate(rect) 
     295            painter.setClipRect(textRect.translated(-rect)) 
    279296            # Draw the QTextDocument in the cell 
    280297            doc.documentLayout().draw(painter, context) 
  • src/sas/qtgui/Utilities/ReportDialog.py

    r30bc96eb r5330be2  
    101101 
    102102        # translate png references into html from base64 string to on-disk name 
    103         cleanr = re.compile('<img src="data:image.*>') 
     103        cleanr = re.compile('<img src.*$') 
    104104        replacement_name = "" 
     105        html = self.data_html 
    105106        for picture in pictures: 
    106107            replacement_name += '<img src="'+ picture + '"><p></p>' 
    107  
    108108        # <img src="data:image/png;.*>  => <img src=filename> 
    109109        html = re.sub(cleanr, replacement_name, self.data_html) 
  • src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui

    rd4dac80 r1f95cbe  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>680</width> 
    10     <height>605</height> 
     9    <width>552</width> 
     10    <height>609</height> 
    1111   </rect> 
    1212  </property> 
     
    1919  <property name="minimumSize"> 
    2020   <size> 
    21     <width>434</width> 
     21    <width>481</width> 
    2222    <height>466</height> 
    2323   </size> 
     
    8282      </attribute> 
    8383      <layout class="QGridLayout" name="gridLayout_4"> 
    84        <item row="0" column="0" colspan="4"> 
     84       <item row="1" column="0"> 
     85        <widget class="QGroupBox" name="groupBox_7"> 
     86         <property name="title"> 
     87          <string>Options </string> 
     88         </property> 
     89         <layout class="QVBoxLayout" name="verticalLayout"> 
     90          <item> 
     91           <widget class="QCheckBox" name="chkPolydispersity"> 
     92            <property name="enabled"> 
     93             <bool>true</bool> 
     94            </property> 
     95            <property name="toolTip"> 
     96             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     97            </property> 
     98            <property name="text"> 
     99             <string>Polydispersity</string> 
     100            </property> 
     101            <property name="checkable"> 
     102             <bool>true</bool> 
     103            </property> 
     104           </widget> 
     105          </item> 
     106          <item> 
     107           <widget class="QCheckBox" name="chk2DView"> 
     108            <property name="enabled"> 
     109             <bool>true</bool> 
     110            </property> 
     111            <property name="toolTip"> 
     112             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     113            </property> 
     114            <property name="text"> 
     115             <string>2D view</string> 
     116            </property> 
     117            <property name="checkable"> 
     118             <bool>true</bool> 
     119            </property> 
     120           </widget> 
     121          </item> 
     122          <item> 
     123           <widget class="QCheckBox" name="chkMagnetism"> 
     124            <property name="enabled"> 
     125             <bool>true</bool> 
     126            </property> 
     127            <property name="toolTip"> 
     128             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     129            </property> 
     130            <property name="text"> 
     131             <string>Magnetism</string> 
     132            </property> 
     133            <property name="checkable"> 
     134             <bool>true</bool> 
     135            </property> 
     136           </widget> 
     137          </item> 
     138          <item> 
     139           <widget class="QCheckBox" name="chkChainFit"> 
     140            <property name="enabled"> 
     141             <bool>true</bool> 
     142            </property> 
     143            <property name="toolTip"> 
     144             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     145            </property> 
     146            <property name="text"> 
     147             <string>Chain fit</string> 
     148            </property> 
     149            <property name="checkable"> 
     150             <bool>true</bool> 
     151            </property> 
     152           </widget> 
     153          </item> 
     154         </layout> 
     155        </widget> 
     156       </item> 
     157       <item row="1" column="3"> 
     158        <widget class="QGroupBox" name="groupBox_8"> 
     159         <property name="title"> 
     160          <string>Fitting details </string> 
     161         </property> 
     162         <layout class="QGridLayout" name="gridLayout_17"> 
     163          <item row="0" column="0" colspan="2"> 
     164           <layout class="QGridLayout" name="gridLayout_8"> 
     165            <item row="0" column="0"> 
     166             <widget class="QLabel" name="label_16"> 
     167              <property name="text"> 
     168               <string>Min range</string> 
     169              </property> 
     170             </widget> 
     171            </item> 
     172            <item row="0" column="1"> 
     173             <widget class="QLabel" name="lblMinRangeDef"> 
     174              <property name="text"> 
     175               <string>0.005</string> 
     176              </property> 
     177             </widget> 
     178            </item> 
     179            <item row="0" column="2"> 
     180             <widget class="QLabel" name="label_17"> 
     181              <property name="text"> 
     182               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     183&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     184              </property> 
     185             </widget> 
     186            </item> 
     187            <item row="1" column="0"> 
     188             <widget class="QLabel" name="label_18"> 
     189              <property name="text"> 
     190               <string>Max range</string> 
     191              </property> 
     192             </widget> 
     193            </item> 
     194            <item row="1" column="1"> 
     195             <widget class="QLabel" name="lblMaxRangeDef"> 
     196              <property name="text"> 
     197               <string>0.1</string> 
     198              </property> 
     199             </widget> 
     200            </item> 
     201            <item row="1" column="2"> 
     202             <widget class="QLabel" name="label_19"> 
     203              <property name="text"> 
     204               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     205&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     206              </property> 
     207             </widget> 
     208            </item> 
     209           </layout> 
     210          </item> 
     211          <item row="1" column="0"> 
     212           <widget class="QLabel" name="label_20"> 
     213            <property name="text"> 
     214             <string>Smearing:</string> 
     215            </property> 
     216           </widget> 
     217          </item> 
     218          <item row="1" column="1"> 
     219           <widget class="QLabel" name="lblCurrentSmearing"> 
     220            <property name="text"> 
     221             <string>None</string> 
     222            </property> 
     223           </widget> 
     224          </item> 
     225         </layout> 
     226        </widget> 
     227       </item> 
     228       <item row="0" column="0" colspan="6"> 
    85229        <widget class="QGroupBox" name="groupBox_6"> 
    86230         <property name="sizePolicy"> 
     
    156300        </widget> 
    157301       </item> 
    158        <item row="1" column="0"> 
    159         <widget class="QGroupBox" name="groupBox_7"> 
    160          <property name="title"> 
    161           <string>Options </string> 
    162          </property> 
    163          <layout class="QVBoxLayout" name="verticalLayout"> 
    164           <item> 
    165            <widget class="QCheckBox" name="chkPolydispersity"> 
    166             <property name="enabled"> 
    167              <bool>true</bool> 
    168             </property> 
    169             <property name="toolTip"> 
    170              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    171             </property> 
    172             <property name="text"> 
    173              <string>Polydispersity</string> 
    174             </property> 
    175             <property name="checkable"> 
    176              <bool>true</bool> 
    177             </property> 
    178            </widget> 
    179           </item> 
    180           <item> 
    181            <widget class="QCheckBox" name="chk2DView"> 
    182             <property name="enabled"> 
    183              <bool>true</bool> 
    184             </property> 
    185             <property name="toolTip"> 
    186              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    187             </property> 
    188             <property name="text"> 
    189              <string>2D view</string> 
    190             </property> 
    191             <property name="checkable"> 
    192              <bool>true</bool> 
    193             </property> 
    194            </widget> 
    195           </item> 
    196           <item> 
    197            <widget class="QCheckBox" name="chkMagnetism"> 
    198             <property name="enabled"> 
    199              <bool>true</bool> 
    200             </property> 
    201             <property name="toolTip"> 
    202              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    203             </property> 
    204             <property name="text"> 
    205              <string>Magnetism</string> 
    206             </property> 
    207             <property name="checkable"> 
    208              <bool>true</bool> 
    209             </property> 
    210            </widget> 
    211           </item> 
    212           <item> 
    213            <widget class="QCheckBox" name="chkChainFit"> 
    214             <property name="enabled"> 
    215              <bool>true</bool> 
    216             </property> 
    217             <property name="toolTip"> 
    218              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    219             </property> 
    220             <property name="text"> 
    221              <string>Chain fit</string> 
    222             </property> 
    223             <property name="checkable"> 
    224              <bool>true</bool> 
    225             </property> 
    226            </widget> 
    227           </item> 
    228          </layout> 
    229         </widget> 
    230        </item> 
    231        <item row="1" column="1"> 
    232         <widget class="QGroupBox" name="groupBox_8"> 
    233          <property name="title"> 
    234           <string>Fitting details </string> 
    235          </property> 
    236          <layout class="QGridLayout" name="gridLayout_17"> 
    237           <item row="0" column="0" colspan="2"> 
    238            <layout class="QGridLayout" name="gridLayout_8"> 
    239             <item row="0" column="0"> 
    240              <widget class="QLabel" name="label_16"> 
    241               <property name="text"> 
    242                <string>Min range</string> 
    243               </property> 
    244              </widget> 
    245             </item> 
    246             <item row="0" column="1"> 
    247              <widget class="QLabel" name="lblMinRangeDef"> 
    248               <property name="text"> 
    249                <string>0.005</string> 
    250               </property> 
    251              </widget> 
    252             </item> 
    253             <item row="0" column="2"> 
    254              <widget class="QLabel" name="label_17"> 
    255               <property name="text"> 
    256                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    257 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    258               </property> 
    259              </widget> 
    260             </item> 
    261             <item row="1" column="0"> 
    262              <widget class="QLabel" name="label_18"> 
    263               <property name="text"> 
    264                <string>Max range</string> 
    265               </property> 
    266              </widget> 
    267             </item> 
    268             <item row="1" column="1"> 
    269              <widget class="QLabel" name="lblMaxRangeDef"> 
    270               <property name="text"> 
    271                <string>0.1</string> 
    272               </property> 
    273              </widget> 
    274             </item> 
    275             <item row="1" column="2"> 
    276              <widget class="QLabel" name="label_19"> 
    277               <property name="text"> 
    278                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    279 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    280               </property> 
    281              </widget> 
    282             </item> 
    283            </layout> 
    284           </item> 
    285           <item row="1" column="0"> 
    286            <widget class="QLabel" name="label_20"> 
    287             <property name="text"> 
    288              <string>Smearing:</string> 
    289             </property> 
    290            </widget> 
    291           </item> 
    292           <item row="1" column="1"> 
    293            <widget class="QLabel" name="lblCurrentSmearing"> 
    294             <property name="text"> 
    295              <string>None</string> 
    296             </property> 
    297            </widget> 
    298           </item> 
    299          </layout> 
    300         </widget> 
    301        </item> 
    302302       <item row="1" column="2"> 
    303303        <spacer name="horizontalSpacer_3"> 
     
    307307         <property name="sizeHint" stdset="0"> 
    308308          <size> 
    309            <width>207</width> 
     309           <width>150</width> 
    310310           <height>20</height> 
    311311          </size> 
     
    313313        </spacer> 
    314314       </item> 
    315        <item row="1" column="3"> 
     315       <item row="1" column="5"> 
    316316        <widget class="QGroupBox" name="groupBox_9"> 
    317317         <property name="title"> 
     
    336336            </item> 
    337337           </layout> 
     338          </item> 
     339         </layout> 
     340        </widget> 
     341       </item> 
     342       <item row="1" column="1"> 
     343        <widget class="QGroupBox" name="groupBox"> 
     344         <property name="title"> 
     345          <string>S(Q) options</string> 
     346         </property> 
     347         <layout class="QVBoxLayout" name="verticalLayout_2"> 
     348          <item> 
     349           <widget class="QLabel" name="label_3"> 
     350            <property name="text"> 
     351             <string>Calc. method</string> 
     352            </property> 
     353           </widget> 
     354          </item> 
     355          <item> 
     356           <widget class="QComboBox" name="cbProductMethod"> 
     357            <property name="enabled"> 
     358             <bool>false</bool> 
     359            </property> 
     360            <property name="minimumSize"> 
     361             <size> 
     362              <width>83</width> 
     363              <height>0</height> 
     364             </size> 
     365            </property> 
     366           </widget> 
     367          </item> 
     368          <item> 
     369           <spacer name="verticalSpacer"> 
     370            <property name="orientation"> 
     371             <enum>Qt::Vertical</enum> 
     372            </property> 
     373            <property name="sizeType"> 
     374             <enum>QSizePolicy::Fixed</enum> 
     375            </property> 
     376            <property name="sizeHint" stdset="0"> 
     377             <size> 
     378              <width>20</width> 
     379              <height>40</height> 
     380             </size> 
     381            </property> 
     382           </spacer> 
    338383          </item> 
    339384         </layout> 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r3f5b901 r548f8e2  
    255255 
    256256        # We have 4 more rows now 
    257         self.assertEqual(self.widget._model_model.rowCount(), rowcount+4) 
     257        self.assertEqual(self.widget._model_model.rowCount(), rowcount+5) 
    258258 
    259259        # Switch models 
     
    275275        self.widget.cbStructureFactor.setCurrentIndex(last_index-1) 
    276276        # Do we have all the rows? 
    277         self.assertEqual(self.widget._model_model.rowCount(), 4) 
     277        self.assertEqual(self.widget._model_model.rowCount(), 5) 
    278278 
    279279        # Are the command buttons properly enabled? 
     
    497497        Test opening of the load file dialog for 'array' polydisp. function 
    498498        """ 
     499 
     500        # open a non-existent file 
    499501        filename = os.path.join("UnitTesting", "testdata_noexist.txt") 
     502        with self.assertRaises(OSError, msg="testdata_noexist.txt should be a non-existent file"): 
     503            os.stat(filename) 
    500504        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    501505        self.widget.show() 
     
    513517 
    514518        # good file 
     519        # TODO: this depends on the working directory being src/sas/qtgui, 
     520        # TODO: which isn't convenient if you want to run this test suite 
     521        # TODO: individually 
    515522        filename = os.path.join("UnitTesting", "testdata.txt") 
     523        try: 
     524            os.stat(filename) 
     525        except OSError: 
     526            self.assertTrue(False, "testdata.txt does not exist") 
    516527        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    517528 
     
    10121023 
    10131024         # Check the model 
    1014         self.assertEqual(self.widget._model_model.rowCount(), 6) 
     1025        self.assertEqual(self.widget._model_model.rowCount(), 7) 
    10151026        self.assertEqual(self.widget._model_model.columnCount(), 5) 
    10161027 
     
    11281139        # two rows selected 
    11291140        index1 = self.widget.lstParams.model().index(1, 0, QtCore.QModelIndex()) 
    1130         index2 = self.widget.lstParams.model().index(2, 0, QtCore.QModelIndex()) 
     1141        index2 = self.widget.lstParams.model().index(3, 0, QtCore.QModelIndex()) 
    11311142        selection_model = self.widget.lstParams.selectionModel() 
    11321143        selection_model.select(index1, selection_model.Select | selection_model.Rows) 
     
    11641175        # several random parameters 
    11651176        self.assertEqual(self.widget.getRowFromName('scale'), 0) 
    1166         self.assertEqual(self.widget.getRowFromName('length'), 5) 
     1177        self.assertEqual(self.widget.getRowFromName('length'), 6) 
    11671178 
    11681179    def testGetParamNames(self): 
     
    12011212        # Create a constraint object 
    12021213        const = Constraint(parent=None, value=7.0) 
    1203         row = 2 
     1214        row = 3 
    12041215 
    12051216        spy = QtSignalSpy(self.widget, self.widget.constraintAddedSignal) 
     
    12201231        # assign complex constraint now 
    12211232        const = Constraint(parent=None, param='radius', func='5*sld') 
    1222         row = 4 
     1233        row = 5 
    12231234        # call the method tested 
    12241235        self.widget.addConstraintToRow(constraint=const, row=row) 
     
    12791290        self.widget.cbModel.setCurrentIndex(model_index) 
    12801291 
     1292        row1 = 1 
     1293        row2 = 5 
     1294 
     1295        param1 = "background" 
     1296        param2 = "radius" 
     1297 
     1298        #default_value1 = "0.001" 
     1299        default_value2 = "20" 
     1300 
    12811301        # select two rows 
    1282         row1 = 1 
    1283         row2 = 4 
    12841302        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    12851303        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    12981316 
    12991317        # delete one of the constraints 
    1300         self.widget.deleteConstraintOnParameter(param='background') 
     1318        self.widget.deleteConstraintOnParameter(param=param1) 
    13011319 
    13021320        # see that the other constraint is still present 
    1303         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1304         self.assertEqual(cons.param, "radius") 
    1305         self.assertEqual(cons.value, "20") 
     1321        cons = self.widget.getConstraintForRow(row2) 
     1322        self.assertEqual(cons.param, param2) 
     1323        self.assertEqual(cons.value, default_value2) 
    13061324 
    13071325        # kill the other constraint 
     
    13091327 
    13101328        # see that the other constraint is still present 
    1311         self.assertEqual(self.widget.getConstraintsForModel(), [('radius', None)]) 
     1329        self.assertEqual(self.widget.getConstraintsForModel(), [(param2, None)]) 
    13121330 
    13131331    def testGetConstraintForRow(self): 
     
    13291347        self.widget.cbModel.setCurrentIndex(model_index) 
    13301348 
     1349        row1 = 1 
     1350        row2 = 5 
     1351 
    13311352        # select two rows 
    1332         row1 = 1 
    1333         row2 = 4 
    13341353        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13351354        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13411360        self.widget.addSimpleConstraint() 
    13421361 
    1343         con_list = [False, True, False, False, True, False] 
     1362        con_list = [False, True, False, False, False, True, False] 
    13441363        new_list = [] 
    13451364        for row in range(self.widget._model_model.rowCount()): 
     
    13591378        self.widget.cbModel.setCurrentIndex(model_index) 
    13601379 
     1380        row1 = 1 
     1381        row2 = 5 
     1382 
    13611383        # select two rows 
    1362         row1 = 1 
    1363         row2 = 4 
    13641384        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13651385        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13751395        constraint_objects[0].active = False 
    13761396 
    1377         con_list = [False, False, False, False, True, False] 
     1397        con_list = [False, False, False, False, False, True, False] 
    13781398        new_list = [] 
    13791399        for row in range(self.widget._model_model.rowCount()): 
     
    13961416        self.assertEqual(self.widget.getConstraintsForModel(),[]) 
    13971417 
     1418        row1 = 1 
     1419        row2 = 5 
     1420 
     1421        param1 = "background" 
     1422        param2 = "radius" 
     1423 
     1424        default_value1 = "0.001" 
     1425        default_value2 = "20" 
     1426 
    13981427        # select two rows 
    1399         row1 = 1 
    1400         row2 = 4 
    14011428        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    14021429        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    14101437        # simple constraints 
    14111438        # self.assertEqual(self.widget.getConstraintsForModel(), [('background', '0.001'), ('radius', '20')]) 
    1412         cons = self.widget.getConstraintForRow(1) # 1 - background 
    1413         self.assertEqual(cons.param, "background") 
    1414         self.assertEqual(cons.value, "0.001") 
    1415         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1416         self.assertEqual(cons.param, "radius") 
    1417         self.assertEqual(cons.value, "20") 
     1439        cons = self.widget.getConstraintForRow(row1) 
     1440        self.assertEqual(cons.param, param1) 
     1441        self.assertEqual(cons.value, default_value1) 
     1442        cons = self.widget.getConstraintForRow(row2) 
     1443        self.assertEqual(cons.param, param2) 
     1444        self.assertEqual(cons.value, default_value2) 
    14181445 
    14191446        objects = self.widget.getConstraintObjectsForModel() 
    14201447        self.assertEqual(len(objects), 2) 
    1421         self.assertEqual(objects[1].value, '20') 
    1422         self.assertEqual(objects[0].param, 'background') 
     1448        self.assertEqual(objects[1].value, default_value2) 
     1449        self.assertEqual(objects[0].param, param1) 
     1450 
     1451        row = 0 
     1452        param = "scale" 
     1453        func = "5*sld" 
    14231454 
    14241455        # add complex constraint 
    1425         const = Constraint(parent=None, param='scale', func='5*sld') 
    1426         row = 0 
     1456        const = Constraint(parent=None, param=param, func=func) 
    14271457        self.widget.addConstraintToRow(constraint=const, row=row) 
    14281458        #self.assertEqual(self.widget.getConstraintsForModel(),[('scale', '5*sld'), ('background', '0.001'), ('radius', None)]) 
    1429         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1430         self.assertEqual(cons.param, "radius") 
    1431         self.assertEqual(cons.value, "20") 
     1459        cons = self.widget.getConstraintForRow(row2) 
     1460        self.assertEqual(cons.param, param2) 
     1461        self.assertEqual(cons.value, default_value2) 
    14321462 
    14331463        objects = self.widget.getConstraintObjectsForModel() 
    14341464        self.assertEqual(len(objects), 3) 
    1435         self.assertEqual(objects[0].func, '5*sld') 
     1465        self.assertEqual(objects[0].func, func) 
    14361466 
    14371467    def testReplaceConstraintName(self): 
Note: See TracChangeset for help on using the changeset viewer.