Changeset 4532 for trunk/GSASIIctrlGUI.py
- Timestamp:
- Jul 22, 2020 8:50:13 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIctrlGUI.py
r4499 r4532 3855 3855 ''' 3856 3856 def __init__(self,parent,title,parmDict,varyList,fullVaryList, 3857 size=(375,430)): 3857 parmMinDict={}, parmMaxDict={}, frozenList=[], 3858 size=(650,430)): 3858 3859 3859 3860 wx.Dialog.__init__(self,parent,wx.ID_ANY,title,size=size, … … 3863 3864 self.varyList = varyList 3864 3865 self.fullVaryList = fullVaryList 3866 self.parmMinDict = parmMinDict 3867 self.parmMaxDict = parmMaxDict 3868 self.frozenList = frozenList 3865 3869 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'] 3866 3874 3867 3875 # make lists of variables of different types along with lists of parameter names, histogram #s, phase #s,... … … 3879 3887 self.choiceDict['Histogram'] = G2obj.SortVariables(hisNames) 3880 3888 self.hisNums = sorted(list(set([int(item.split(':')[1]) for item in hisNames]))) 3881 self.hisNums = [' 3889 self.hisNums = ['*',]+[str(item) for item in self.hisNums] 3882 3890 self.hisVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[0]]))) 3883 3891 phasNames = [':'.join(item) for item in splitNames if not item[1] and 'is' not in item[2]] 3884 3892 self.choiceDict['Phase'] = G2obj.SortVariables(phasNames) 3885 self.phasNums = sorted([' 3893 self.phasNums = sorted(['*',]+list(set([item.split(':')[0] for item in phasNames]))) 3886 3894 if '' in self.phasNums: self.phasNums.remove('') 3887 3895 self.phasVars = sorted(list(set([' ',]+[item[2] for item in splitNames if not item[1] and 'is' not in item[2]]))) … … 3890 3898 self.hapVars = sorted(list(set([' ',]+[item[2] for item in splitNames if item[0] and item[1]]))) 3891 3899 3892 self.hisNum = ' 3893 self.phasNum = ' 3900 self.hisNum = '*' 3901 self.phasNum = '*' 3894 3902 self.varName = ' ' 3895 3903 self.listSel = 'Refined' … … 3897 3905 3898 3906 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 3902 3908 ''' 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) 3962 3911 self.SendSizeEvent() 3963 3912 if GSASIIpath.GetConfigValue('debug'): 3913 print('repaintScrollTbl',time.time()-start) 3914 3964 3915 def DrawPanel(self): 3965 3916 '''Draws the contents of the entire dialog. Called initially & when radio buttons are pressed … … 3987 3938 event.Skip() 3988 3939 self.varName = varSel.GetValue() 3989 self.phasNum = ' 3940 self.phasNum = '*' 3990 3941 if phasSel: phasSel.SetSelection(0) 3991 self.hisNum = ' 3942 self.hisNum = '*' 3992 3943 if histSel: histSel.SetSelection(0) 3993 3944 wx.CallAfter(self.repaintScrollTbl) … … 4027 3978 varSelSizer.Add(varSpin,0) 4028 3979 varSizer.Add(varSelSizer,0) 4029 3980 4030 3981 if self.GetSizer(): self.GetSizer().Clear(True) 4031 3982 self.SpinDict = {} 4032 3983 mainSizer = wx.BoxSizer(wx.VERTICAL) 4033 3984 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) 4035 3988 if len(self.varyList) != len(self.fullVaryList): 4036 3989 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) 4038 3995 choice = ['Phase','Phase/Histo','Histogram'] 4039 3996 if 'Global' in self.choiceDict: … … 4067 4024 numSizer = wx.BoxSizer(wx.VERTICAL) 4068 4025 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)) 4070 4027 AddSpinner(numSizer,'Phase',phasSel,OnPhasSel) 4071 4028 varSizer.Add(numSizer) … … 4075 4032 numSizer = wx.BoxSizer(wx.VERTICAL) 4076 4033 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)) 4078 4035 AddSpinner(numSizer,'Histogram',histSel,OnHistSel) 4079 4036 varSizer.Add(numSizer) 4080 4037 selectionsSizer.Add(varSizer,0) 4081 4038 parmSizer.Add(selectionsSizer,0) 4082 mainSizer.Add(parmSizer,0)4083 4084 4039 listSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:', 4085 4040 choices=['All','Refined'], … … 4087 4042 listSel.SetStringSelection(self.listSel) 4088 4043 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 4090 4047 4091 4048 self.countSizer = wx.BoxSizer(wx.VERTICAL) … … 4093 4050 self.headSizer = wx.BoxSizer(wx.HORIZONTAL) # non-scrolling header 4094 4051 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 4103 4063 btn = wx.Button(self, wx.ID_CLOSE,"Close") 4104 4064 btn.Bind(wx.EVT_BUTTON,self._onClose) … … 4110 4070 def _onClose(self,event): 4111 4071 self.EndModal(wx.ID_CANCEL) 4072 4073 class 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 4112 4175 4113 4176 ################################################################################
Note: See TracChangeset
for help on using the changeset viewer.