Ignore:
Timestamp:
Jul 22, 2020 8:50:13 PM (3 years ago)
Author:
toby
Message:

refactor ViewLSparms; more fullrmc work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrlGUI.py

    r4499 r4532  
    38553855    '''
    38563856    def __init__(self,parent,title,parmDict,varyList,fullVaryList,
    3857                  size=(375,430)):
     3857                     parmMinDict={}, parmMaxDict={}, frozenList=[],
     3858                     size=(650,430)):
    38583859       
    38593860        wx.Dialog.__init__(self,parent,wx.ID_ANY,title,size=size,
     
    38633864        self.varyList = varyList
    38643865        self.fullVaryList = fullVaryList
     3866        self.parmMinDict = parmMinDict
     3867        self.parmMaxDict = parmMaxDict
     3868        self.frozenList = frozenList
    38653869        self.choiceDict = {}
     3870        # if GSASIIpath.GetConfigValue('debug'):
     3871        #     print('dummy settings for frozenList etc')
     3872        #     self.parmMinDict['0::Afrac:26'] = 0.0
     3873        #     self.frozenList = ['0::Afrac:26']       
    38663874
    38673875        # make lists of variables of different types along with lists of parameter names, histogram #s, phase #s,...
     
    38793887        self.choiceDict['Histogram'] = G2obj.SortVariables(hisNames)
    38803888        self.hisNums = sorted(list(set([int(item.split(':')[1]) for item in hisNames])))
    3881         self.hisNums = [' ',]+[str(item) for item in self.hisNums]
     3889        self.hisNums = ['*',]+[str(item) for item in self.hisNums]
    38823890        self.hisVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[0]])))
    38833891        phasNames = [':'.join(item) for item in splitNames if not item[1] and 'is' not in item[2]]
    38843892        self.choiceDict['Phase'] = G2obj.SortVariables(phasNames)
    3885         self.phasNums = sorted([' ',]+list(set([item.split(':')[0] for item in phasNames])))
     3893        self.phasNums = sorted(['*',]+list(set([item.split(':')[0] for item in phasNames])))
    38863894        if '' in self.phasNums: self.phasNums.remove('')
    38873895        self.phasVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[1] and 'is' not in item[2]])))
     
    38903898        self.hapVars = sorted(list(set([' ',]+[item[2] for item in splitNames if item[0] and item[1]])))
    38913899       
    3892         self.hisNum = ' '
    3893         self.phasNum = ' '
     3900        self.hisNum = '*'
     3901        self.phasNum = '*'
    38943902        self.varName = ' '
    38953903        self.listSel = 'Refined'
     
    38973905       
    38983906    def repaintScrollTbl(self):
    3899         '''Shows the selected variables
    3900 
    3901         This routine is pretty slow when lots of variables are selected. Why?
     3907        '''Shows the selected variables in a ListCtrl
    39023908        '''
    3903         self.countSizer.Clear(True)
    3904         self.headSizer.Clear(True)
    3905         self.scrolledSizer.Clear(True)
    3906         self.explainSizer.Clear(True)
    3907        
    3908         explainRefine = False
    3909         count = 0
    3910         for name in self.choiceDict[self.parmChoice]:
    3911             if '2' in platform.python_version_tuple()[0]:
    3912                 basestr = basestring
    3913             else:
    3914                 basestr = str
    3915             if isinstance(self.parmDict[name],basestr): continue
    3916             if 'Refined' in self.listSel and (name not in self.fullVaryList
    3917                                               ) and (name not in self.varyList):
    3918                 continue
    3919             if 'Phase' in self.parmChoice:
    3920                 if self.phasNum != ' ' and name.split(':')[0] != self.phasNum: continue
    3921             if 'Histo' in self.parmChoice:
    3922                 if self.hisNum != ' ' and name.split(':')[1] != self.hisNum: continue
    3923             if (self.varName != ' ') and (self.varName not in name): continue
    3924             try:
    3925                 value = G2py3.FormatSigFigs(self.parmDict[name])
    3926             except TypeError:
    3927                 value = str(self.parmDict[name])+' -?' # unexpected
    3928                 #continue
    3929             v = G2obj.getVarDescr(name)
    3930             if v is None or v[-1] is None:
    3931                 self.scrolledSizer.Add((-1,-1))
    3932             else:               
    3933                 ch = HelpButton(self.panel,G2obj.fmtVarDescr(name))
    3934                 self.scrolledSizer.Add(ch,0,wx.LEFT|wx.RIGHT|WACV|wx.ALIGN_CENTER,1)
    3935             self.scrolledSizer.Add(wx.StaticText(self.panel,wx.ID_ANY,str(name)))
    3936             if name in self.varyList:
    3937                 self.scrolledSizer.Add(wx.StaticText(self.panel,label='R',size=(50,-1)))   #TODO? maybe a checkbox for one stop refinement flag setting?
    3938             elif name in self.fullVaryList:
    3939                 self.scrolledSizer.Add(wx.StaticText(self.panel,label='C',size=(50,-1)))
    3940                 explainRefine = True
    3941             else:
    3942                 self.scrolledSizer.Add((50,-1))
    3943             self.scrolledSizer.Add(wx.StaticText(self.panel,label=value),0,wx.ALIGN_RIGHT)
    3944             count += 1
    3945             if count > 200:
    3946                 msg = wx.StaticText(self,label='Too many parameters selected. Showing first 200')
    3947                 msg.SetBackgroundColour(wx.YELLOW)
    3948                 self.countSizer.Add(msg,0,wx.ALIGN_LEFT)
    3949                 self.countSizer.Add((-1,10))
    3950                 break
    3951        
    3952         if explainRefine:
    3953             self.explainSizer.Add(
    3954                 wx.StaticText(self,label='"R" indicates a refined variable\n'+
    3955                     '"C" indicates generated from a constraint'),0, wx.ALL,0)
    3956         self.panel.SetAutoLayout(1)
    3957         self.panel.SetupScrolling()
    3958         self.SetMinSize(self.GetSize())        # Allow window to be enlarged but not made smaller
    3959         for txt,wid,loc in zip(['','Parameter name','refine?','value'],self.scrolledSizer.GetColWidths(),
    3960                            [wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_LEFT,wx.ALIGN_RIGHT]):
    3961             self.headSizer.Add(wx.StaticText(self,wx.ID_ANY,txt,size=(wid,-1),style=loc),0,loc)
     3909        start = time.time()
     3910        self.varBox.SetContents(self)
    39623911        self.SendSizeEvent()
    3963            
     3912        if GSASIIpath.GetConfigValue('debug'):
     3913            print('repaintScrollTbl',time.time()-start)
     3914                   
    39643915    def DrawPanel(self):
    39653916        '''Draws the contents of the entire dialog. Called initially & when radio buttons are pressed
     
    39873938            event.Skip()
    39883939            self.varName = varSel.GetValue()
    3989             self.phasNum = ' '
     3940            self.phasNum = '*'
    39903941            if phasSel: phasSel.SetSelection(0)
    3991             self.hisNum = ' '
     3942            self.hisNum = '*'
    39923943            if histSel: histSel.SetSelection(0)
    39933944            wx.CallAfter(self.repaintScrollTbl)
     
    40273978            varSelSizer.Add(varSpin,0)
    40283979            varSizer.Add(varSelSizer,0)
    4029            
     3980
    40303981        if self.GetSizer(): self.GetSizer().Clear(True)
    40313982        self.SpinDict = {}
    40323983        mainSizer = wx.BoxSizer(wx.VERTICAL)
    40333984        num = len(self.varyList)
    4034         mainSizer.Add(wx.StaticText(self,label=' Number of refined variables: '+str(num)),0,wx.ALIGN_CENTER)
     3985        mainSizer.Add(wx.StaticText(self,label='View Parameters in Project'),0,wx.ALIGN_CENTER)
     3986        parmSizer = wx.BoxSizer(wx.HORIZONTAL)
     3987        parmSizer.Add(wx.StaticText(self,label=' Number of refined variables: {}'.format(num)),0,wx.ALIGN_LEFT)
    40353988        if len(self.varyList) != len(self.fullVaryList):
    40363989            num = len(self.fullVaryList) - len(self.varyList)
    4037             mainSizer.Add(wx.StaticText(self,label=' + '+str(num)+' parameters are varied via constraints'))
     3990            parmSizer.Add(wx.StaticText(self,label=
     3991                ' + {} parameters are varied via constraints'.format(
     3992                    len(self.fullVaryList) - len(self.varyList))
     3993                                        ))
     3994        mainSizer.Add(parmSizer)
    40383995        choice = ['Phase','Phase/Histo','Histogram']
    40393996        if 'Global' in self.choiceDict:
     
    40674024            numSizer = wx.BoxSizer(wx.VERTICAL)
    40684025            phasSel = wx.ComboBox(self,choices=self.phasNums,value=self.phasNum,
    4069                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
     4026                style=wx.CB_READONLY|wx.CB_DROPDOWN,size=(50,-1))
    40704027            AddSpinner(numSizer,'Phase',phasSel,OnPhasSel)
    40714028            varSizer.Add(numSizer)
     
    40754032            numSizer = wx.BoxSizer(wx.VERTICAL)
    40764033            histSel = wx.ComboBox(self,choices=self.hisNums,value=self.hisNum,
    4077                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
     4034                style=wx.CB_READONLY|wx.CB_DROPDOWN,size=(50,-1))
    40784035            AddSpinner(numSizer,'Histogram',histSel,OnHistSel)
    40794036            varSizer.Add(numSizer)
    40804037        selectionsSizer.Add(varSizer,0)
    40814038        parmSizer.Add(selectionsSizer,0)
    4082         mainSizer.Add(parmSizer,0)
    4083        
    40844039        listSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:',
    40854040            choices=['All','Refined'],
     
    40874042        listSel.SetStringSelection(self.listSel)
    40884043        listSel.Bind(wx.EVT_RADIOBOX,OnListSel)
    4089         mainSizer.Add(listSel,0)
     4044        parmSizer.Add(listSel,0,wx.CENTER|wx.ALL,15)
     4045        mainSizer.Add(parmSizer,0)
     4046       
    40904047       
    40914048        self.countSizer = wx.BoxSizer(wx.VERTICAL)
     
    40934050        self.headSizer = wx.BoxSizer(wx.HORIZONTAL) # non-scrolling header       
    40944051        mainSizer.Add(self.headSizer,0)
    4095         self.panel = wxscroll.ScrolledPanel(self)       
    4096         self.scrolledSizer = wx.FlexGridSizer(cols=4,hgap=2,vgap=2)
    4097         self.panel.SetSizer(self.scrolledSizer)
    4098         mainSizer.Add(self.panel,1,wx.ALL|wx.EXPAND,1)
    4099         self.explainSizer = wx.BoxSizer(wx.VERTICAL)
    4100         mainSizer.Add(self.explainSizer)
    4101         # make OK button
    4102         btnsizer = wx.BoxSizer(wx.HORIZONTAL)
     4052        self.varBox = VirtualVarBox(self)
     4053        mainSizer.Add(self.varBox,1,wx.ALL|wx.EXPAND,1)
     4054
     4055        txt = ('"R" indicates a refined variable\n'+
     4056                    '"C" indicates generated from a constraint')
     4057        # if GSASIIpath.GetConfigValue('debug'):
     4058        #     txt += '\n"F" indicates a variable that is Frozen due to exceeding min/max'
     4059        mainSizer.Add(
     4060            wx.StaticText(self,label=txt),0, wx.ALL,0)
     4061
     4062        btnsizer = wx.BoxSizer(wx.HORIZONTAL)          # make Close button
    41034063        btn = wx.Button(self, wx.ID_CLOSE,"Close")
    41044064        btn.Bind(wx.EVT_BUTTON,self._onClose)
     
    41104070    def _onClose(self,event):
    41114071        self.EndModal(wx.ID_CANCEL)
     4072       
     4073class VirtualVarBox(wx.ListCtrl):
     4074    def __init__(self, parent):
     4075        self.parmWin = parent
     4076        wx.ListCtrl.__init__(
     4077            self, parent, -1,
     4078            style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES
     4079            )
     4080
     4081        # if GSASIIpath.GetConfigValue('debug'):
     4082        #     for i,(lbl,wid) in enumerate(zip(
     4083        #         ('#', "Parameter", "Ref?", "Value", "Min", "Max", "Explanation"),
     4084        #         (40 , 100        , 35    ,  100   ,  75  ,  75  , 700),)): 
     4085        #         self.InsertColumn(i, lbl)
     4086        #         self.SetColumnWidth(i, wid)
     4087        # else:
     4088        if True:
     4089            for i,(lbl,wid) in enumerate(zip(
     4090                ('#', "Parameter", "Ref?", "Value", "", "", "Explanation"),
     4091                (40 , 100        , 35    ,  100   ,  5  ,  5  , 700),)): 
     4092                self.InsertColumn(i, lbl)
     4093                self.SetColumnWidth(i, wid)
     4094
     4095        self.SetItemCount(0)
     4096
     4097        self.attr1 = wx.ListItemAttr()
     4098        self.attr1.SetBackgroundColour((255,255,150))
     4099
     4100        if GSASIIpath.GetConfigValue('debug'):
     4101            self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
     4102        #self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColSelected)
     4103
     4104    def SetContents(self,parent):
     4105        self.varList = []
     4106        for name in parent.choiceDict[parent.parmChoice]:
     4107            if '2' in platform.python_version_tuple()[0]:
     4108                basestr = basestring
     4109            else:
     4110                basestr = str
     4111            if isinstance(parent.parmDict[name],basestr): continue
     4112            if 'Refined' in parent.listSel and (name not in parent.fullVaryList
     4113                                              ) and (name not in parent.varyList):
     4114                continue
     4115            if 'Phase' in parent.parmChoice:
     4116                if parent.phasNum != '*' and name.split(':')[0] != parent.phasNum: continue
     4117            if 'Histo' in parent.parmChoice:
     4118                if parent.hisNum != '*' and name.split(':')[1] != parent.hisNum: continue
     4119            if (parent.varName != ' ') and (parent.varName not in name): continue
     4120            self.varList.append(name)
     4121        oldlen = self.GetItemCount()
     4122        self.SetItemCount(len(self.varList))
     4123       
     4124    def OnItemSelected(self, event):
     4125        print('OnItemSelected: "%s"\n' % (event.Index))
     4126    #def OnColSelected(self, event):
     4127    #    print('Column selected:',event.Column)
     4128    #    #G2p.IPyBreak_base()
     4129    #-----------------------------------------------------------------
     4130    # Callbacks to set info in table
     4131    def OnGetItemText(self, item, col):
     4132        name = self.varList[item]
     4133        if col == 0:
     4134            return str(item)
     4135        elif col == 1:
     4136            return name
     4137        elif col == 2:
     4138            if name in self.parmWin.varyList:
     4139                if name in self.parmWin.frozenList:
     4140                    return "F"
     4141                return "R"
     4142            elif name in self.parmWin.fullVaryList:
     4143                return "C"
     4144            return ""
     4145        elif col == 3:
     4146            try:
     4147                value = G2py3.FormatSigFigs(self.parmWin.parmDict[name])
     4148            except TypeError:
     4149                value = str(self.parmWin.parmDict[name])+' -?' # unexpected
     4150            return value
     4151                #continue
     4152        elif col == 4:
     4153            if name in self.parmWin.parmMinDict:
     4154                return G2py3.FormatSigFigs(self.parmWin.parmMinDict[name],8)
     4155            return "" # min value
     4156        elif col == 5:
     4157            if name in self.parmWin.parmMaxDict:
     4158                return G2py3.FormatSigFigs(self.parmWin.parmMaxDict[name],8)
     4159            return "" # max value
     4160        elif col == 6:
     4161            v = G2obj.getVarDescr(name)
     4162            if v is not None and v[-1] is not None:
     4163                txt = G2obj.fmtVarDescr(name)
     4164                if txt: return txt
     4165            return ""
     4166        else:
     4167            return "?"
     4168
     4169    def OnGetItemAttr(self, item):
     4170        name = self.varList[item]
     4171        if name in self.parmWin.varyList and name in self.parmWin.frozenList:
     4172            return self.attr1
     4173        else:
     4174            return None
    41124175
    41134176################################################################################
Note: See TracChangeset for help on using the changeset viewer.