Changeset 848
- Timestamp:
- Feb 7, 2013 10:43:11 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIIO.py
r846 r848 755 755 'Histograms':{}, 756 756 'Pawley ref':[], 757 ' Models':{},757 'RBModels':{}, 758 758 } 759 759 return phaseData -
trunk/GSASIIconstrGUI.py
r842 r848 20 20 import GSASIIElem as G2elem 21 21 import GSASIIElemGUI as G2elemGUI 22 import GSASIIphsGUI as G2phG23 22 import GSASIIstruct as G2str 24 23 import GSASIImapvars as G2mv … … 879 878 rbData['rbSeq'].append([Orig,Piv,0.0,Riding]) 880 879 dlg.Destroy() 881 UpdateResidueRB() 880 UpdateResidueRB() 881 882 882 883 883 def AddZMatrixRB(): … … 1006 1006 vecGrid.Bind(wg.EVT_GRID_CELL_LEFT_DCLICK, TypeSelect) 1007 1007 attr = wx.grid.GridCellAttr() 1008 attr.SetEditor(G2 phG.GridFractionEditor(vecGrid))1008 attr.SetEditor(G2gd.GridFractionEditor(vecGrid)) 1009 1009 for c in range(3): 1010 1010 vecGrid.SetColAttr(c, attr) … … 1125 1125 vecGrid.Bind(wg.EVT_GRID_CELL_LEFT_DCLICK, TypeSelect) 1126 1126 attr = wx.grid.GridCellAttr() 1127 attr.SetEditor(G2 phG.GridFractionEditor(vecGrid))1127 attr.SetEditor(G2gd.GridFractionEditor(vecGrid)) 1128 1128 for c in range(3): 1129 1129 vecGrid.SetColAttr(c, attr) 1130 1130 for row in range(vecTable.GetNumberRows()): 1131 for col in [4,5,6]:1131 for col in range(5): 1132 1132 vecGrid.SetCellStyle(row,col,VERY_LIGHT_GREY,True) 1133 1133 vecGrid.SetMargins(0,0) … … 1152 1152 def OnRadBtn(event): 1153 1153 Obj = event.GetEventObject() 1154 Seq,iSeq,ang = Indx[Obj.GetId()]1155 data['Residue'][rbId]['SelSeq'] = [iSeq,ang ]1154 Seq,iSeq,angId = Indx[Obj.GetId()] 1155 data['Residue'][rbId]['SelSeq'] = [iSeq,angId] 1156 1156 angSlide.SetValue(int(100*Seq[2])) 1157 1157 … … 1162 1162 if not iSeq: 1163 1163 radBt = wx.RadioButton(ResidueRBDisplay,-1,'',style=wx.RB_GROUP) 1164 data['Residue'][rbId]['SelSeq'] = [iSeq,ang ]1164 data['Residue'][rbId]['SelSeq'] = [iSeq,ang.GetId()] 1165 1165 else: 1166 1166 radBt = wx.RadioButton(ResidueRBDisplay,-1,'') … … 1169 1169 bond = wx.TextCtrl(ResidueRBDisplay,-1,'%s %s'%(atNames[iBeg],atNames[iFin]),size=(50,20)) 1170 1170 seqSizer.Add(bond,0,wx.ALIGN_CENTER_VERTICAL) 1171 Indx[radBt.GetId()] = [Seq,iSeq,ang ]1172 Indx[ang.GetId()] = [rbId,Seq ]1171 Indx[radBt.GetId()] = [Seq,iSeq,ang.GetId()] 1172 Indx[ang.GetId()] = [rbId,Seq,ang] 1173 1173 ang.Bind(wx.EVT_TEXT_ENTER,ChangeAngle) 1174 1174 ang.Bind(wx.EVT_KILL_FOCUS,ChangeAngle) … … 1186 1186 Obj = event.GetEventObject() 1187 1187 rbData = Indx[Obj.GetId()] 1188 iSeq,ang = rbData['SelSeq']1188 iSeq,angId = rbData['SelSeq'] 1189 1189 val = float(Obj.GetValue())/100. 1190 1190 rbData['rbSeq'][iSeq][2] = val 1191 ang.SetValue('%8.2f'%(val))1191 Indx[angId][2].SetValue('%8.2f'%(val)) 1192 1192 G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults) 1193 1193 1194 1194 slideSizer = wx.BoxSizer(wx.HORIZONTAL) 1195 1195 slideSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Selected torsion angle:'),0) 1196 iSeq,ang = rbData['SelSeq']1196 iSeq,angId = rbData['SelSeq'] 1197 1197 angSlide = wx.Slider(ResidueRBDisplay,-1, 1198 1198 int(100*rbData['rbSeq'][iSeq][2]),0,36000,size=(200,20), … … 1227 1227 if rbData['rbSeq']: 1228 1228 ResidueRBSizer.Add(slideSizer,) 1229 ResidueRBSizer.Add(wx.StaticText(ResidueRBDisplay,-1,100*'-')) 1230 1229 1231 ResidueRBSizer.Add((5,25),) 1230 1232 ResidueRBSizer.Layout() -
trunk/GSASIIgrid.py
r843 r848 54 54 [ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 55 55 wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSVIEWADD, wxID_ATOMVIEWINSERT, 56 wxID_RELOADDRAWATOMS,wxID_ATOMSDISAGL,wxID_ATOMMOVE, 57 ] = [wx.NewId() for item in range(11)] 56 wxID_RELOADDRAWATOMS,wxID_ATOMSDISAGL,wxID_ATOMMOVE,wxID_RBAPPEND, 57 wxID_ASSIGNATMS2RB 58 ] = [wx.NewId() for item in range(13)] 58 59 59 60 [ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, … … 105 106 106 107 [ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ, 107 wxID_ZMATRIXADD, 108 ] = [wx.NewId() for item in range( 5)]108 wxID_ZMATRIXADD,wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE 109 ] = [wx.NewId() for item in range(7)] 109 110 110 111 [ wxID_SAVESEQSEL, … … 120 121 VERY_LIGHT_GREY = wx.Colour(235,235,235) 121 122 122 def ShowHelp(helpType,frame): 123 '''Called to bring up a web page for documentation.''' 124 global htmlFirstUse 125 # look up a definition for help info from dict 126 helplink = helpLocDict.get(helpType) 127 if helplink is None: 128 # no defined link to use, create a default based on key 129 helplink = 'gsasII.html#'+helpType.replace(' ','_') 130 helplink = os.path.join(path2GSAS2,'help',helplink) 131 if helpMode == 'internal': 123 ################################################################################ 124 #### GSAS-II class definitions 125 ################################################################################ 126 127 class SymOpDialog(wx.Dialog): 128 def __init__(self,parent,SGData,New=True,ForceUnit=False): 129 wx.Dialog.__init__(self,parent,-1,'Select symmetry operator', 130 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 131 panel = wx.Panel(self) 132 self.SGData = SGData 133 self.New = New 134 self.Force = ForceUnit 135 self.OpSelected = [0,0,0,[0,0,0],False,False] 136 mainSizer = wx.BoxSizer(wx.VERTICAL) 137 if ForceUnit: 138 choice = ['No','Yes'] 139 self.force = wx.RadioBox(panel,-1,'Force to unit cell?',choices=choice) 140 self.force.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 141 mainSizer.Add(self.force,0,wx.ALIGN_CENTER_VERTICAL) 142 mainSizer.Add((5,5),0) 143 if SGData['SGInv']: 144 choice = ['No','Yes'] 145 self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice) 146 self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 147 mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL) 148 mainSizer.Add((5,5),0) 149 if SGData['SGLatt'] != 'P': 150 LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';') 151 self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp) 152 self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 153 mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL) 154 mainSizer.Add((5,5),0) 155 if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']: 156 Ncol = 2 157 else: 158 Ncol = 3 159 OpList = [] 160 for M,T in SGData['SGOps']: 161 OpList.append(G2spc.MT2text(M,T)) 162 self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList, 163 majorDimension=Ncol) 164 self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 165 mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL) 166 mainSizer.Add((5,5),0) 167 mainSizer.Add(wx.StaticText(panel,-1," Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL) 168 mainSizer.Add((5,5),0) 169 cellSizer = wx.BoxSizer(wx.HORIZONTAL) 170 cellSizer.Add((5,0),0) 171 cellName = ['X','Y','Z'] 172 self.cell = [] 173 for i in range(3): 174 self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20))) 175 self.cell[-1].SetRange(-3,3) 176 self.cell[-1].SetValue(0) 177 self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect) 178 cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL) 179 mainSizer.Add(cellSizer,0,) 180 if self.New: 181 choice = ['No','Yes'] 182 self.new = wx.RadioBox(panel,-1,'Generate new positions?',choices=choice) 183 self.new.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 184 mainSizer.Add(self.new,0,wx.ALIGN_CENTER_VERTICAL) 185 mainSizer.Add((5,5),0) 186 187 OkBtn = wx.Button(panel,-1,"Ok") 188 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 189 cancelBtn = wx.Button(panel,-1,"Cancel") 190 cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 191 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 192 btnSizer.Add((20,20),1) 193 btnSizer.Add(OkBtn) 194 btnSizer.Add((20,20),1) 195 btnSizer.Add(cancelBtn) 196 btnSizer.Add((20,20),1) 197 198 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 199 panel.SetSizer(mainSizer) 200 panel.Fit() 201 self.Fit() 202 203 def OnOpSelect(self,event): 204 if self.SGData['SGInv']: 205 self.OpSelected[0] = self.inv.GetSelection() 206 if self.SGData['SGLatt'] != 'P': 207 self.OpSelected[1] = self.latt.GetSelection() 208 self.OpSelected[2] = self.oprs.GetSelection() 209 for i in range(3): 210 self.OpSelected[3][i] = float(self.cell[i].GetValue()) 211 if self.New: 212 self.OpSelected[4] = self.new.GetSelection() 213 if self.Force: 214 self.OpSelected[5] = self.force.GetSelection() 215 216 def GetSelection(self): 217 return self.OpSelected 218 219 def OnOk(self,event): 220 parent = self.GetParent() 221 parent.Raise() 222 self.EndModal(wx.ID_OK) 223 224 def OnCancel(self,event): 225 parent = self.GetParent() 226 parent.Raise() 227 self.EndModal(wx.ID_CANCEL) 228 229 class DisAglDialog(wx.Dialog): 230 231 def __default__(self,data,default): 232 if data: 233 self.data = data 234 else: 235 self.data = {} 236 self.data['Name'] = default['Name'] 237 self.data['Factors'] = [0.85,0.85] 238 self.data['AtomTypes'] = default['AtomTypes'] 239 self.data['BondRadii'] = default['BondRadii'] 240 self.data['AngleRadii'] = default['AngleRadii'] 241 242 def __init__(self,parent,data,default): 243 wx.Dialog.__init__(self,parent,-1,'Distance Angle Controls', 244 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 245 self.default = default 246 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw! 247 self.__default__(data,self.default) 248 self.Draw(self.data) 249 250 def Draw(self,data): 251 self.panel.Destroy() 252 self.panel = wx.Panel(self) 253 mainSizer = wx.BoxSizer(wx.VERTICAL) 254 mainSizer.Add(wx.StaticText(self.panel,-1,'Controls for phase '+data['Name']), 255 0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10) 256 mainSizer.Add((10,10),1) 257 258 radiiSizer = wx.FlexGridSizer(2,3,5,5) 259 radiiSizer.Add(wx.StaticText(self.panel,-1,' Type'),0,wx.ALIGN_CENTER_VERTICAL) 260 radiiSizer.Add(wx.StaticText(self.panel,-1,'Bond radii'),0,wx.ALIGN_CENTER_VERTICAL) 261 radiiSizer.Add(wx.StaticText(self.panel,-1,'Angle radii'),0,wx.ALIGN_CENTER_VERTICAL) 262 self.objList = {} 263 for id,item in enumerate(self.data['AtomTypes']): 264 radiiSizer.Add(wx.StaticText(self.panel,-1,' '+item),0,wx.ALIGN_CENTER_VERTICAL) 265 bRadii = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['BondRadii'][id]),style=wx.TE_PROCESS_ENTER) 266 self.objList[bRadii.GetId()] = ['BondRadii',id] 267 bRadii.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 268 bRadii.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 269 radiiSizer.Add(bRadii,0,wx.ALIGN_CENTER_VERTICAL) 270 aRadii = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['AngleRadii'][id]),style=wx.TE_PROCESS_ENTER) 271 self.objList[aRadii.GetId()] = ['AngleRadii',id] 272 aRadii.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 273 aRadii.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 274 radiiSizer.Add(aRadii,0,wx.ALIGN_CENTER_VERTICAL) 275 mainSizer.Add(radiiSizer,0,wx.EXPAND) 276 factorSizer = wx.FlexGridSizer(2,2,5,5) 277 Names = ['Bond','Angle'] 278 for i,name in enumerate(Names): 279 factorSizer.Add(wx.StaticText(self.panel,-1,name+' search factor'),0,wx.ALIGN_CENTER_VERTICAL) 280 bondFact = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['Factors'][i]),style=wx.TE_PROCESS_ENTER) 281 self.objList[bondFact.GetId()] = ['Factors',i] 282 bondFact.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 283 bondFact.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 284 factorSizer.Add(bondFact) 285 mainSizer.Add(factorSizer,0,wx.EXPAND) 286 287 OkBtn = wx.Button(self.panel,-1,"Ok") 288 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 289 ResetBtn = wx.Button(self.panel,-1,'Reset') 290 ResetBtn.Bind(wx.EVT_BUTTON, self.OnReset) 291 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 292 btnSizer.Add((20,20),1) 293 btnSizer.Add(OkBtn) 294 btnSizer.Add(ResetBtn) 295 btnSizer.Add((20,20),1) 296 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 297 self.panel.SetSizer(mainSizer) 298 self.panel.Fit() 299 self.Fit() 300 301 def OnRadiiVal(self,event): 302 Obj = event.GetEventObject() 303 item = self.objList[Obj.GetId()] 132 304 try: 133 htmlPanel.LoadFile(helplink) 134 htmlFrame.Raise() 135 except: 136 htmlFrame = wx.Frame(frame, -1, size=(610, 510)) 137 htmlFrame.Show(True) 138 htmlFrame.SetTitle("HTML Window") # N.B. reset later in LoadFile 139 htmlPanel = MyHtmlPanel(htmlFrame,-1) 140 htmlPanel.LoadFile(helplink) 141 else: 142 pfx = "file://" 143 if sys.platform.lower().startswith('win'): 144 pfx = '' 145 if htmlFirstUse: 146 webbrowser.open_new(pfx+helplink) 147 htmlFirstUse = False 305 self.data[item[0]][item[1]] = float(Obj.GetValue()) 306 except ValueError: 307 pass 308 Obj.SetValue("%.3f"%(self.data[item[0]][item[1]])) #reset in case of error 309 310 def GetData(self): 311 return self.data 312 313 def OnOk(self,event): 314 parent = self.GetParent() 315 parent.Raise() 316 self.EndModal(wx.ID_OK) 317 318 def OnReset(self,event): 319 data = {} 320 self.__default__(data,self.default) 321 self.Draw(self.data) 322 323 class SingleFloatDialog(wx.Dialog): 324 325 def __init__(self,parent,title,prompt,value,limits=[0.,1.],format='%.5g'): 326 wx.Dialog.__init__(self,parent,-1,title, 327 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 328 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw! 329 self.limits = limits 330 self.value = value 331 self.prompt = prompt 332 self.format = format 333 self.Draw() 334 335 def Draw(self): 336 337 def OnValItem(event): 338 try: 339 val = float(valItem.GetValue()) 340 if val < self.limits[0] or val > self.limits[1]: 341 raise ValueError 342 except ValueError: 343 val = self.value 344 self.value = val 345 valItem.SetValue(self.format%(self.value)) 346 347 self.panel.Destroy() 348 self.panel = wx.Panel(self) 349 mainSizer = wx.BoxSizer(wx.VERTICAL) 350 mainSizer.Add(wx.StaticText(self.panel,-1,self.prompt),0,wx.ALIGN_CENTER) 351 valItem = wx.TextCtrl(self.panel,-1,value=self.format%(self.value),style=wx.TE_PROCESS_ENTER) 352 mainSizer.Add(valItem,0,wx.ALIGN_CENTER) 353 valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem) 354 valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem) 355 OkBtn = wx.Button(self.panel,-1,"Ok") 356 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 357 CancelBtn = wx.Button(self.panel,-1,'Cancel') 358 CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 359 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 360 btnSizer.Add((20,20),1) 361 btnSizer.Add(OkBtn) 362 btnSizer.Add(CancelBtn) 363 btnSizer.Add((20,20),1) 364 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 365 self.panel.SetSizer(mainSizer) 366 self.panel.Fit() 367 self.Fit() 368 369 def GetValue(self): 370 return self.value 371 372 def OnOk(self,event): 373 parent = self.GetParent() 374 parent.Raise() 375 self.EndModal(wx.ID_OK) 376 377 def OnCancel(self,event): 378 parent = self.GetParent() 379 parent.Raise() 380 self.EndModal(wx.ID_CANCEL) 381 382 class GridFractionEditor(wg.PyGridCellEditor): 383 def __init__(self,grid): 384 wg.PyGridCellEditor.__init__(self) 385 386 def Create(self, parent, id, evtHandler): 387 self._tc = wx.TextCtrl(parent, id, "") 388 self._tc.SetInsertionPoint(0) 389 self.SetControl(self._tc) 390 391 if evtHandler: 392 self._tc.PushEventHandler(evtHandler) 393 394 self._tc.Bind(wx.EVT_CHAR, self.OnChar) 395 396 def SetSize(self, rect): 397 self._tc.SetDimensions(rect.x, rect.y, rect.width+2, rect.height+2, 398 wx.SIZE_ALLOW_MINUS_ONE) 399 400 def BeginEdit(self, row, col, grid): 401 self.startValue = grid.GetTable().GetValue(row, col) 402 self._tc.SetValue(str(self.startValue)) 403 self._tc.SetInsertionPointEnd() 404 self._tc.SetFocus() 405 self._tc.SetSelection(0, self._tc.GetLastPosition()) 406 407 def EndEdit(self, row, col, grid): 408 changed = False 409 410 val = self._tc.GetValue().lower() 411 412 if val != self.startValue: 413 changed = True 414 neg = False 415 if '-' in val: 416 neg = True 417 if '/' in val and '.' not in val: 418 val += '.' 419 elif 's' in val and not 'sind(' in val: 420 if neg: 421 val = '-sind('+val.strip('-s')+')' 422 else: 423 val = 'sind('+val.strip('s')+')' 424 elif 'c' in val and not 'cosd(' in val: 425 if neg: 426 val = '-cosd('+val.strip('-c')+')' 427 else: 428 val = 'cosd('+val.strip('c')+')' 429 try: 430 val = float(eval(val)) 431 except (SyntaxError,NameError): 432 val = self.startValue 433 grid.GetTable().SetValue(row, col, val) # update the table 434 435 self.startValue = '' 436 self._tc.SetValue('') 437 return changed 438 439 def Reset(self): 440 self._tc.SetValue(self.startValue) 441 self._tc.SetInsertionPointEnd() 442 443 def Clone(self): 444 return GridFractionEditor(grid) 445 446 def StartingKey(self, evt): 447 self.OnChar(evt) 448 if evt.GetSkipped(): 449 self._tc.EmulateKeyPress(evt) 450 451 def OnChar(self, evt): 452 key = evt.GetKeyCode() 453 if key == 15: 454 return 455 if key > 255: 456 evt.Skip() 457 return 458 char = chr(key) 459 if char in '.+-/0123456789cosind()': 460 self._tc.WriteText(char) 148 461 else: 149 webbrowser.open(pfx+helplink, new=0, autoraise=True)462 evt.Skip() 150 463 151 464 class MyHelp(wx.Menu): … … 743 1056 self.AtomEdit.Append(id=wxID_ATOMSVIEWADD, kind=wx.ITEM_NORMAL,text='Append view point', 744 1057 help='Appended as an H atom') 1058 self.AtomEdit.Append(id=wxID_RBAPPEND, kind=wx.ITEM_NORMAL,text='Append rigid body', 1059 help='Append atoms for rigid body') 745 1060 self.AtomEdit.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom', 746 1061 help='Select atom row to insert before; inserted as an H atom') 747 1062 self.AtomEdit.Append(id=wxID_ATOMVIEWINSERT, kind=wx.ITEM_NORMAL,text='Insert view point', 748 1063 help='Select atom row to insert before; inserted as an H atom') 1064 self.AtomEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body', 1065 help='Select atom row to start assignment') 749 1066 self.AtomEdit.Append(id=wxID_ATOMMOVE, kind=wx.ITEM_NORMAL,text='Move atom to view point', 750 1067 help='Select single atom to move') … … 873 1190 self.RigidBodiesEdit = wx.Menu(title='') 874 1191 self.RigidBodiesMenu.Append(menu=self.RigidBodiesEdit, title='Edit') 1192 self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues', 1193 help='Auto find of residue RBs in macromolecule') 1194 self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine', 1195 help='Global setting of residue RB refinement flags') 875 1196 876 1197 self.PostfillDataMenu() … … 1083 1404 self.data[row][col] = value 1084 1405 innerSetValue(row, col, value) 1406 1407 ################################################################################ 1408 #### Help 1409 ################################################################################ 1410 1411 def ShowHelp(helpType,frame): 1412 '''Called to bring up a web page for documentation.''' 1413 global htmlFirstUse 1414 # look up a definition for help info from dict 1415 helplink = helpLocDict.get(helpType) 1416 if helplink is None: 1417 # no defined link to use, create a default based on key 1418 helplink = 'gsasII.html#'+helpType.replace(' ','_') 1419 helplink = os.path.join(path2GSAS2,'help',helplink) 1420 if helpMode == 'internal': 1421 try: 1422 htmlPanel.LoadFile(helplink) 1423 htmlFrame.Raise() 1424 except: 1425 htmlFrame = wx.Frame(frame, -1, size=(610, 510)) 1426 htmlFrame.Show(True) 1427 htmlFrame.SetTitle("HTML Window") # N.B. reset later in LoadFile 1428 htmlPanel = MyHtmlPanel(htmlFrame,-1) 1429 htmlPanel.LoadFile(helplink) 1430 else: 1431 pfx = "file://" 1432 if sys.platform.lower().startswith('win'): 1433 pfx = '' 1434 if htmlFirstUse: 1435 webbrowser.open_new(pfx+helplink) 1436 htmlFirstUse = False 1437 else: 1438 webbrowser.open(pfx+helplink, new=0, autoraise=True) 1085 1439 1086 1440 ################################################################################ … … 1283 1637 'histNames' - list of histogram names in order as processed by Sequential Refinement 1284 1638 'varyList' - list of variables - identical over all refinements insequence 1285 histName- dictionaries for all data sets processed:1639 'histName' - dictionaries for all data sets processed: 1286 1640 'variables'- result[0] from leastsq call 1287 1641 'varyList' - list of variables; same as above -
trunk/GSASIImath.py
r826 r848 1203 1203 except KeyError: 1204 1204 return Parms['Lam1'][1] 1205 1206 def UpdateResRBAtoms(Amat,Bmat,Atoms,AtLookUp,RBObj,RBData): 1207 RBIds = GetResRBIds(RBData) 1208 RBRes = RBData[RBIds[RBObj['ResName']]] 1209 XYZ = np.array(RBRes['rbXYZ']) 1210 for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']): 1211 QuatA = AVdeg2Q(tor[0],XYZ[seq[0]]-XYZ[seq[1]]) 1212 for ride in seq[3]: 1213 VB = prodQVQ(QuatA,XYZ[ride]-XYZ[seq[1]]) 1214 XYZ[ride] += VB 1215 for i,xyz in enumerate(XYZ): 1216 xyz = prodQVQ(RBObj['Orient'][0],xyz) 1217 xyz = np.inner(Bmat,xyz) 1218 xyz += RBObj['Orig'][0] 1219 XYZ[i] = xyz 1220 Atxyz = GetAtomsById(Atoms,AtLookUp,RBObj['Ids']) 1221 1222 def GetResRBIds(RBData): 1223 rbKeys = RBData.keys() 1224 rbKeys.remove('AtInfo') 1225 if not len(rbKeys): 1226 return {} 1227 RBNames = [RBData[k]['RBname'] for k in rbKeys] 1228 return dict(zip(RBNames,rbKeys)) 1229 1205 1230 1206 1231 def prodQQ(QA,QB): … … 1298 1323 Q[1:4] = V*S 1299 1324 return Q 1300 1325 1326 def makeQuat(A,B,C): 1327 ''' Make quaternion from rotation of A vector to B vector about C axis 1328 A,B,C are np.array Cartesian 3-vectors 1329 Returns quaternion & rotation angle in radians 1330 ''' 1331 1332 V1 = np.cross(A,C) 1333 V2 = np.cross(B,C) 1334 if nl.norm(V1)*nl.norm(V2): 1335 V1 /= nl.norm(V1) 1336 V2 /= nl.norm(V2) 1337 V3 = np.cross(V1,V2) 1338 else: 1339 v3 = np.zero(3) 1340 Q = np.array([1.0,0.0,0.0,0.0]) 1341 D = 0. 1342 if nl.norm(V3): 1343 V3 /= nl.norm(V3) 1344 D1 = min(1.0,max(-1.0,np.vdot(V1,V2))) 1345 D = np.arccos(D1)/2.0 1346 V1 = C-V3 1347 V2 = C+V3 1348 DM = nl.norm(V1) 1349 DP = nl.norm(V2) 1350 S = np.sin(D) 1351 Q[0] = np.cos(D) 1352 Q[1:] = V3*S 1353 D *= 2. 1354 if DM > DP: 1355 D *= -1. 1356 return Q,D 1357 -
trunk/GSASIIphsGUI.py
r844 r848 24 24 import GSASIIElem as G2elem 25 25 import GSASIIElemGUI as G2elemGUI 26 import GSASIIddataGUI as G2ddG 26 27 import GSASIIplot as G2plt 27 28 import GSASIIgrid as G2gd … … 46 47 acosd = lambda x: 180.*np.arccos(x)/np.pi 47 48 48 class SymOpDialog(wx.Dialog): 49 def __init__(self,parent,SGData,New=True,ForceUnit=False): 50 wx.Dialog.__init__(self,parent,-1,'Select symmetry operator', 51 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 52 panel = wx.Panel(self) 53 self.SGData = SGData 54 self.New = New 55 self.Force = ForceUnit 56 self.OpSelected = [0,0,0,[0,0,0],False,False] 57 mainSizer = wx.BoxSizer(wx.VERTICAL) 58 if ForceUnit: 59 choice = ['No','Yes'] 60 self.force = wx.RadioBox(panel,-1,'Force to unit cell?',choices=choice) 61 self.force.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 62 mainSizer.Add(self.force,0,wx.ALIGN_CENTER_VERTICAL) 63 mainSizer.Add((5,5),0) 64 if SGData['SGInv']: 65 choice = ['No','Yes'] 66 self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice) 67 self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 68 mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL) 69 mainSizer.Add((5,5),0) 70 if SGData['SGLatt'] != 'P': 71 LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';') 72 self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp) 73 self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 74 mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL) 75 mainSizer.Add((5,5),0) 76 if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']: 77 Ncol = 2 78 else: 79 Ncol = 3 80 OpList = [] 81 for M,T in SGData['SGOps']: 82 OpList.append(G2spc.MT2text(M,T)) 83 self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList, 84 majorDimension=Ncol) 85 self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 86 mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL) 87 mainSizer.Add((5,5),0) 88 mainSizer.Add(wx.StaticText(panel,-1," Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL) 89 mainSizer.Add((5,5),0) 90 cellSizer = wx.BoxSizer(wx.HORIZONTAL) 91 cellSizer.Add((5,0),0) 92 cellName = ['X','Y','Z'] 93 self.cell = [] 94 for i in range(3): 95 self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20))) 96 self.cell[-1].SetRange(-3,3) 97 self.cell[-1].SetValue(0) 98 self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect) 99 cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL) 100 mainSizer.Add(cellSizer,0,) 101 if self.New: 102 choice = ['No','Yes'] 103 self.new = wx.RadioBox(panel,-1,'Generate new positions?',choices=choice) 104 self.new.Bind(wx.EVT_RADIOBOX, self.OnOpSelect) 105 mainSizer.Add(self.new,0,wx.ALIGN_CENTER_VERTICAL) 106 mainSizer.Add((5,5),0) 107 108 OkBtn = wx.Button(panel,-1,"Ok") 109 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 110 cancelBtn = wx.Button(panel,-1,"Cancel") 111 cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 112 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 113 btnSizer.Add((20,20),1) 114 btnSizer.Add(OkBtn) 115 btnSizer.Add((20,20),1) 116 btnSizer.Add(cancelBtn) 117 btnSizer.Add((20,20),1) 118 119 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 120 panel.SetSizer(mainSizer) 121 panel.Fit() 122 self.Fit() 123 124 def OnOpSelect(self,event): 125 if self.SGData['SGInv']: 126 self.OpSelected[0] = self.inv.GetSelection() 127 if self.SGData['SGLatt'] != 'P': 128 self.OpSelected[1] = self.latt.GetSelection() 129 self.OpSelected[2] = self.oprs.GetSelection() 130 for i in range(3): 131 self.OpSelected[3][i] = float(self.cell[i].GetValue()) 132 if self.New: 133 self.OpSelected[4] = self.new.GetSelection() 134 if self.Force: 135 self.OpSelected[5] = self.force.GetSelection() 136 137 def GetSelection(self): 138 return self.OpSelected 139 140 def OnOk(self,event): 141 parent = self.GetParent() 142 parent.Raise() 143 self.EndModal(wx.ID_OK) 144 145 def OnCancel(self,event): 146 parent = self.GetParent() 147 parent.Raise() 148 self.EndModal(wx.ID_CANCEL) 149 150 class DisAglDialog(wx.Dialog): 49 def UpdatePhaseData(G2frame,Item,data,oldPage): 151 50 152 def __default__(self,data,default): 153 if data: 154 self.data = data 155 else: 156 self.data = {} 157 self.data['Name'] = default['Name'] 158 self.data['Factors'] = [0.85,0.85] 159 self.data['AtomTypes'] = default['AtomTypes'] 160 self.data['BondRadii'] = default['BondRadii'] 161 self.data['AngleRadii'] = default['AngleRadii'] 162 163 def __init__(self,parent,data,default): 164 wx.Dialog.__init__(self,parent,-1,'Distance Angle Controls', 165 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 166 self.default = default 167 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw! 168 self.__default__(data,self.default) 169 self.Draw(self.data) 170 171 def Draw(self,data): 172 self.panel.Destroy() 173 self.panel = wx.Panel(self) 174 mainSizer = wx.BoxSizer(wx.VERTICAL) 175 mainSizer.Add(wx.StaticText(self.panel,-1,'Controls for phase '+data['Name']), 176 0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10) 177 mainSizer.Add((10,10),1) 178 179 radiiSizer = wx.FlexGridSizer(2,3,5,5) 180 radiiSizer.Add(wx.StaticText(self.panel,-1,' Type'),0,wx.ALIGN_CENTER_VERTICAL) 181 radiiSizer.Add(wx.StaticText(self.panel,-1,'Bond radii'),0,wx.ALIGN_CENTER_VERTICAL) 182 radiiSizer.Add(wx.StaticText(self.panel,-1,'Angle radii'),0,wx.ALIGN_CENTER_VERTICAL) 183 self.objList = {} 184 for id,item in enumerate(self.data['AtomTypes']): 185 radiiSizer.Add(wx.StaticText(self.panel,-1,' '+item),0,wx.ALIGN_CENTER_VERTICAL) 186 bRadii = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['BondRadii'][id]),style=wx.TE_PROCESS_ENTER) 187 self.objList[bRadii.GetId()] = ['BondRadii',id] 188 bRadii.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 189 bRadii.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 190 radiiSizer.Add(bRadii,0,wx.ALIGN_CENTER_VERTICAL) 191 aRadii = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['AngleRadii'][id]),style=wx.TE_PROCESS_ENTER) 192 self.objList[aRadii.GetId()] = ['AngleRadii',id] 193 aRadii.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 194 aRadii.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 195 radiiSizer.Add(aRadii,0,wx.ALIGN_CENTER_VERTICAL) 196 mainSizer.Add(radiiSizer,0,wx.EXPAND) 197 factorSizer = wx.FlexGridSizer(2,2,5,5) 198 Names = ['Bond','Angle'] 199 for i,name in enumerate(Names): 200 factorSizer.Add(wx.StaticText(self.panel,-1,name+' search factor'),0,wx.ALIGN_CENTER_VERTICAL) 201 bondFact = wx.TextCtrl(self.panel,-1,value='%.3f'%(data['Factors'][i]),style=wx.TE_PROCESS_ENTER) 202 self.objList[bondFact.GetId()] = ['Factors',i] 203 bondFact.Bind(wx.EVT_TEXT_ENTER,self.OnRadiiVal) 204 bondFact.Bind(wx.EVT_KILL_FOCUS,self.OnRadiiVal) 205 factorSizer.Add(bondFact) 206 mainSizer.Add(factorSizer,0,wx.EXPAND) 207 208 OkBtn = wx.Button(self.panel,-1,"Ok") 209 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 210 ResetBtn = wx.Button(self.panel,-1,'Reset') 211 ResetBtn.Bind(wx.EVT_BUTTON, self.OnReset) 212 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 213 btnSizer.Add((20,20),1) 214 btnSizer.Add(OkBtn) 215 btnSizer.Add(ResetBtn) 216 btnSizer.Add((20,20),1) 217 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 218 self.panel.SetSizer(mainSizer) 219 self.panel.Fit() 220 self.Fit() 51 #patch 52 if 'RBModels' not in data: 53 data['RBModels'] = {} 54 #end patch 221 55 222 def OnRadiiVal(self,event): 223 Obj = event.GetEventObject() 224 item = self.objList[Obj.GetId()] 225 try: 226 self.data[item[0]][item[1]] = float(Obj.GetValue()) 227 except ValueError: 228 pass 229 Obj.SetValue("%.3f"%(self.data[item[0]][item[1]])) #reset in case of error 230 231 def GetData(self): 232 return self.data 233 234 def OnOk(self,event): 235 parent = self.GetParent() 236 parent.Raise() 237 self.EndModal(wx.ID_OK) 238 239 def OnReset(self,event): 240 data = {} 241 self.__default__(data,self.default) 242 self.Draw(self.data) 243 244 class SingleFloatDialog(wx.Dialog): 245 246 def __init__(self,parent,title,prompt,value,limits=[0.,1.],format='%.5g'): 247 wx.Dialog.__init__(self,parent,-1,title, 248 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 249 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw! 250 self.limits = limits 251 self.value = value 252 self.prompt = prompt 253 self.format = format 254 self.Draw() 255 256 def Draw(self): 257 258 def OnValItem(event): 259 try: 260 val = float(valItem.GetValue()) 261 if val < self.limits[0] or val > self.limits[1]: 262 raise ValueError 263 except ValueError: 264 val = self.value 265 self.value = val 266 valItem.SetValue(self.format%(self.value)) 267 268 self.panel.Destroy() 269 self.panel = wx.Panel(self) 270 mainSizer = wx.BoxSizer(wx.VERTICAL) 271 mainSizer.Add(wx.StaticText(self.panel,-1,self.prompt),0,wx.ALIGN_CENTER) 272 valItem = wx.TextCtrl(self.panel,-1,value=self.format%(self.value),style=wx.TE_PROCESS_ENTER) 273 mainSizer.Add(valItem,0,wx.ALIGN_CENTER) 274 valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem) 275 valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem) 276 OkBtn = wx.Button(self.panel,-1,"Ok") 277 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 278 CancelBtn = wx.Button(self.panel,-1,'Cancel') 279 CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 280 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 281 btnSizer.Add((20,20),1) 282 btnSizer.Add(OkBtn) 283 btnSizer.Add(CancelBtn) 284 btnSizer.Add((20,20),1) 285 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 286 self.panel.SetSizer(mainSizer) 287 self.panel.Fit() 288 self.Fit() 289 290 def GetValue(self): 291 return self.value 292 293 def OnOk(self,event): 294 parent = self.GetParent() 295 parent.Raise() 296 self.EndModal(wx.ID_OK) 297 298 def OnCancel(self,event): 299 parent = self.GetParent() 300 parent.Raise() 301 self.EndModal(wx.ID_CANCEL) 302 303 class GridFractionEditor(wg.PyGridCellEditor): 304 def __init__(self,grid): 305 wg.PyGridCellEditor.__init__(self) 306 307 def Create(self, parent, id, evtHandler): 308 self._tc = wx.TextCtrl(parent, id, "") 309 self._tc.SetInsertionPoint(0) 310 self.SetControl(self._tc) 311 312 if evtHandler: 313 self._tc.PushEventHandler(evtHandler) 314 315 self._tc.Bind(wx.EVT_CHAR, self.OnChar) 316 317 def SetSize(self, rect): 318 self._tc.SetDimensions(rect.x, rect.y, rect.width+2, rect.height+2, 319 wx.SIZE_ALLOW_MINUS_ONE) 320 321 def BeginEdit(self, row, col, grid): 322 self.startValue = grid.GetTable().GetValue(row, col) 323 self._tc.SetValue(str(self.startValue)) 324 self._tc.SetInsertionPointEnd() 325 self._tc.SetFocus() 326 self._tc.SetSelection(0, self._tc.GetLastPosition()) 327 328 def EndEdit(self, row, col, grid): 329 changed = False 330 331 val = self._tc.GetValue().lower() 332 333 if val != self.startValue: 334 changed = True 335 neg = False 336 if '-' in val: 337 neg = True 338 if '/' in val and '.' not in val: 339 val += '.' 340 elif 's' in val and not 'sind(' in val: 341 if neg: 342 val = '-sind('+val.strip('-s')+')' 343 else: 344 val = 'sind('+val.strip('s')+')' 345 elif 'c' in val and not 'cosd(' in val: 346 if neg: 347 val = '-cosd('+val.strip('-c')+')' 348 else: 349 val = 'cosd('+val.strip('c')+')' 350 try: 351 val = float(eval(val)) 352 except (SyntaxError,NameError): 353 val = self.startValue 354 grid.GetTable().SetValue(row, col, val) # update the table 355 356 self.startValue = '' 357 self._tc.SetValue('') 358 return changed 359 360 def Reset(self): 361 self._tc.SetValue(self.startValue) 362 self._tc.SetInsertionPointEnd() 363 364 def Clone(self): 365 return GridFractionEditor(grid) 366 367 def StartingKey(self, evt): 368 self.OnChar(evt) 369 if evt.GetSkipped(): 370 self._tc.EmulateKeyPress(evt) 371 372 def OnChar(self, evt): 373 key = evt.GetKeyCode() 374 if key == 15: 375 return 376 if key > 255: 377 evt.Skip() 378 return 379 char = chr(key) 380 if char in '.+-/0123456789cosind()': 381 self._tc.WriteText(char) 382 else: 383 evt.Skip() 384 385 def UpdatePhaseData(G2frame,Item,data,oldPage): 386 387 Atoms = [] 56 # Atoms = [] #not needed?? 388 57 if G2frame.dataDisplay: 389 58 G2frame.dataDisplay.Destroy() … … 420 89 generalData['MCSA controls'] = {'Data source':'','Annealing':[50.0,0.001,0.90,1000], 421 90 'dmin':2.0,'Algolrithm':'Normal','Jump coeff':[0.95,0.5]} #'Normal','Random jump','Tremayne jump' 91 # end of patches 422 92 generalData['NoAtoms'] = {} 423 93 generalData['BondRadii'] = [] … … 538 208 nameSizer.Add(NameTxt,0,wx.ALIGN_CENTER_VERTICAL) 539 209 nameSizer.Add(wx.StaticText(dataDisplay,-1,' Phase type: '),0,wx.ALIGN_CENTER_VERTICAL) 540 if len(data['Atoms']): 541 choices = phaseTypes[:-1] 542 else: 543 choices = phaseTypes 544 TypeTxt = wx.ComboBox(dataDisplay,-1,value=generalData['Type'],choices=choices, 210 TypeTxt = wx.ComboBox(dataDisplay,-1,value=generalData['Type'],choices=phaseTypes, 545 211 style=wx.CB_READONLY|wx.CB_DROPDOWN) 546 212 TypeTxt.Bind(wx.EVT_COMBOBOX, OnPhaseType) … … 1076 742 ################################################################################ 1077 743 1078 def FillAtomsGrid( ):744 def FillAtomsGrid(Atoms): 1079 745 1080 746 G2frame.dataFrame.setSizePosLeft([700,300]) … … 1399 1065 attr = wx.grid.GridCellAttr() 1400 1066 attr.IncRef() #fix from Jim Hester 1401 attr.SetEditor(G ridFractionEditor(Atoms))1067 attr.SetEditor(G2gd.GridFractionEditor(Atoms)) 1402 1068 for c in range(colX,colX+3): 1403 1069 Atoms.SetColAttr(c, attr) … … 1441 1107 def OnAtomAdd(event): 1442 1108 AtomAdd(0,0,0) 1443 FillAtomsGrid( )1109 FillAtomsGrid(Atoms) 1444 1110 event.StopPropagation() 1445 1111 … … 1451 1117 except: 1452 1118 AtomAdd(0,0,0) 1453 FillAtomsGrid( )1119 FillAtomsGrid(Atoms) 1454 1120 event.StopPropagation() 1455 1121 … … 1474 1140 def OnAtomInsert(event): 1475 1141 AtomInsert(0,0,0) 1476 FillAtomsGrid( )1142 FillAtomsGrid(Atoms) 1477 1143 event.StopPropagation() 1478 1144 … … 1482 1148 x,y,z = drawData['viewPoint'][0] 1483 1149 AtomAdd(x,y,z) 1484 FillAtomsGrid( )1150 FillAtomsGrid(Atoms) 1485 1151 event.StopPropagation() 1152 1153 def OnRBAppend(event): 1154 1155 print 'RB append' 1156 1157 def OnRBAssign(event): 1158 print 'RB assign' 1486 1159 1487 1160 def OnAtomMove(event): … … 1497 1170 atomData[indx[0]][cx:cx+3] = [x,y,z] 1498 1171 SetupGeneral() 1499 FillAtomsGrid( )1172 FillAtomsGrid(Atoms) 1500 1173 ID = atomData[indx[0]][-1] 1501 1174 DrawAtomsReplaceByID(data['Drawing'],atomData[indx[0]],ID) … … 1503 1176 event.StopPropagation() 1504 1177 1178 def DrawAtomsReplaceByID(drawingData,atom,ID): 1179 IDs = [ID,] 1180 atomData = drawingData['Atoms'] 1181 indx = G2mth.FindAtomIndexByIDs(atomData,IDs) 1182 for ind in indx: 1183 atomData[ind] = MakeDrawAtom(atom,atomData[ind]) 1184 1185 def MakeDrawAtom(atom,oldatom=None): 1186 AA3letter = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE', 1187 'LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL','MSE','HOH','WAT','UNK'] 1188 AA1letter = ['A','R','N','D','C','Q','E','G','H','I', 1189 'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' '] 1190 generalData = data['General'] 1191 SGData = generalData['SGData'] 1192 if generalData['Type'] == 'nuclear': 1193 if oldatom: 1194 opr = oldatom[5] 1195 if atom[9] == 'A': 1196 X,U = G2spc.ApplyStringOps(opr,SGData,atom[3:6],atom[11:17]) 1197 atomInfo = [atom[:2]+list(X)+oldatom[5:9]+atom[9:11]+list(U)+oldatom[17:]][0] 1198 else: 1199 X = G2spc.ApplyStringOps(opr,SGData,atom[3:6]) 1200 atomInfo = [atom[:2]+list(X)+oldatom[5:9]+atom[9:]+oldatom[17:]][0] 1201 else: 1202 atomInfo = [atom[:2]+atom[3:6]+['1',]+['vdW balls',]+ 1203 ['',]+[[255,255,255],]+atom[9:]+[[],[]]][0] 1204 ct,cs = [1,8] #type & color 1205 elif generalData['Type'] == 'macromolecular': 1206 try: 1207 oneLetter = AA3letter.index(atom[1]) 1208 except ValueError: 1209 oneLetter = -1 1210 atomInfo = [[atom[1].strip()+atom[0],]+ 1211 [AA1letter[oneLetter]+atom[0],]+atom[2:5]+ 1212 atom[6:9]+['1',]+['sticks',]+['',]+[[255,255,255],]+atom[12:]+[[],[]]][0] 1213 ct,cs = [4,11] #type & color 1214 elif generalData['Type'] == 'magnetic': 1215 if oldatom: 1216 atomInfo = [atom[:2]+oldatom[3:]][0] 1217 else: 1218 atomInfo = [atom[:2]+atom[3:6]+['vdW balls',]+['',]+atom[9:]+[[],[]]][0] 1219 ct,cs = [1,8] #type & color 1220 # elif generalData['Type'] == 'modulated': 1221 # ????? for future 1222 atNum = generalData['AtomTypes'].index(atom[ct]) 1223 atomInfo[cs] = list(generalData['Color'][atNum]) 1224 return atomInfo 1225 1505 1226 def AtomInsert(x,y,z): 1506 1227 indx = Atoms.GetSelectedRows() … … 1533 1254 if 'Atoms' in data['Drawing']: 1534 1255 DrawAtomsDeleteByIDs(IDs) 1535 wx.CallAfter(FillAtomsGrid )1256 wx.CallAfter(FillAtomsGrid,Atoms) 1536 1257 G2plt.PlotStructure(G2frame,data) 1537 1258 SetupGeneral() … … 1591 1312 ID = atomData[r][-1] 1592 1313 DrawAtomsReplaceByID(data['Drawing'],atomData[r],ID) 1593 FillAtomsGrid( )1314 FillAtomsGrid(Atoms) 1594 1315 dlg.Destroy() 1595 1316 elif parm in ['Name',]: … … 1605 1326 else: 1606 1327 atomData[r][cid] = El[:1]+'(%d)'%(r+1) 1607 FillAtomsGrid( )1328 FillAtomsGrid(Atoms) 1608 1329 finally: 1609 1330 dlg.Destroy() … … 1617 1338 for r in indx: 1618 1339 atomData[r][cid] = parm 1619 FillAtomsGrid( )1340 FillAtomsGrid(Atoms) 1620 1341 dlg.Destroy() 1621 1342 elif parm in ['frac','Uiso']: … … 1625 1346 limits = [0.,0.25] 1626 1347 val = 0.01 1627 dlg = SingleFloatDialog(G2frame,'New value','Enter new value for '+parm,val,limits)1348 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new value for '+parm,val,limits) 1628 1349 if dlg.ShowModal() == wx.ID_OK: 1629 1350 parm = dlg.GetValue() … … 1631 1352 atomData[r][cid] = parm 1632 1353 SetupGeneral() 1633 FillAtomsGrid( )1354 FillAtomsGrid(Atoms) 1634 1355 dlg.Destroy() 1635 1356 elif parm in ['x','y','z']: 1636 1357 limits = [-1.,1.] 1637 1358 val = 0. 1638 dlg = SingleFloatDialog(G2frame,'Atom shift','Enter shift for '+parm,val,limits)1359 dlg = G2gd.SingleFloatDialog(G2frame,'Atom shift','Enter shift for '+parm,val,limits) 1639 1360 if dlg.ShowModal() == wx.ID_OK: 1640 1361 parm = dlg.GetValue() … … 1642 1363 atomData[r][cid] += parm 1643 1364 SetupGeneral() 1644 FillAtomsGrid( )1365 FillAtomsGrid(Atoms) 1645 1366 dlg.Destroy() 1646 1367 … … 1657 1378 generalData = data['General'] 1658 1379 SGData = generalData['SGData'] 1659 dlg = SymOpDialog(G2frame,SGData,True,True)1380 dlg = G2gd.SymOpDialog(G2frame,SGData,True,True) 1660 1381 New = False 1661 1382 try: … … 1691 1412 Atoms.ClearSelection() 1692 1413 if New: 1693 FillAtomsGrid( )1414 FillAtomsGrid(Atoms) 1694 1415 else: 1695 1416 Atoms.ForceRefresh() … … 1706 1427 if 'DisAglCtls' in generalData: 1707 1428 DisAglCtls = generalData['DisAglCtls'] 1708 dlg = DisAglDialog(G2frame,DisAglCtls,generalData)1429 dlg = G2gd.DisAglDialog(G2frame,DisAglCtls,generalData) 1709 1430 if dlg.ShowModal() == wx.ID_OK: 1710 1431 DisAglCtls = dlg.GetData() … … 1785 1506 data['Drawing'] = drawingData 1786 1507 1787 def MakeDrawAtom(atom,oldatom=None):1788 AA3letter = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE',1789 'LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL','MSE','HOH','WAT','UNK']1790 AA1letter = ['A','R','N','D','C','Q','E','G','H','I',1791 'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' ']1792 generalData = data['General']1793 SGData = generalData['SGData']1794 if generalData['Type'] == 'nuclear':1795 if oldatom:1796 opr = oldatom[5]1797 if atom[9] == 'A':1798 X,U = G2spc.ApplyStringOps(opr,SGData,atom[3:6],atom[11:17])1799 atomInfo = [atom[:2]+list(X)+oldatom[5:9]+atom[9:11]+list(U)+oldatom[17:]][0]1800 else:1801 X = G2spc.ApplyStringOps(opr,SGData,atom[3:6])1802 atomInfo = [atom[:2]+list(X)+oldatom[5:9]+atom[9:]+oldatom[17:]][0]1803 else:1804 atomInfo = [atom[:2]+atom[3:6]+['1',]+['vdW balls',]+1805 ['',]+[[255,255,255],]+atom[9:]+[[],[]]][0]1806 ct,cs = [1,8] #type & color1807 elif generalData['Type'] == 'macromolecular':1808 try:1809 oneLetter = AA3letter.index(atom[1])1810 except ValueError:1811 oneLetter = -11812 atomInfo = [[atom[1].strip()+atom[0],]+1813 [AA1letter[oneLetter]+atom[0],]+atom[2:5]+1814 atom[6:9]+['1',]+['sticks',]+['',]+[[255,255,255],]+atom[12:]+[[],[]]][0]1815 ct,cs = [4,11] #type & color1816 elif generalData['Type'] == 'magnetic':1817 if oldatom:1818 atomInfo = [atom[:2]+oldatom[3:]][0]1819 else:1820 atomInfo = [atom[:2]+atom[3:6]+['vdW balls',]+['',]+atom[9:]+[[],[]]][0]1821 ct,cs = [1,8] #type & color1822 # elif generalData['Type'] == 'modulated':1823 # ????? for future1824 atNum = generalData['AtomTypes'].index(atom[ct])1825 atomInfo[cs] = list(generalData['Color'][atNum])1826 return atomInfo1827 1828 1508 def DrawAtomAdd(drawingData,atom): 1829 1509 drawingData['Atoms'].append(MakeDrawAtom(atom)) 1830 1510 1831 def DrawAtomsReplaceByID(drawingData,atom,ID):1832 IDs = [ID,]1833 atomData = drawingData['Atoms']1834 indx = G2mth.FindAtomIndexByIDs(atomData,IDs)1835 for ind in indx:1836 atomData[ind] = MakeDrawAtom(atom,atomData[ind])1837 1838 1511 def OnRestraint(event): 1839 1512 indx = drawAtoms.GetSelectedRows() … … 2242 1915 generalData = data['General'] 2243 1916 SGData = generalData['SGData'] 2244 dlg = SymOpDialog(G2frame,SGData,False,True)1917 dlg = G2gd.SymOpDialog(G2frame,SGData,False,True) 2245 1918 try: 2246 1919 if dlg.ShowModal() == wx.ID_OK: … … 2289 1962 generalData = data['General'] 2290 1963 SGData = generalData['SGData'] 2291 dlg = SymOpDialog(G2frame,SGData,False,True)1964 dlg = G2gd.SymOpDialog(G2frame,SGData,False,True) 2292 1965 try: 2293 1966 if dlg.ShowModal() == wx.ID_OK: … … 3188 2861 3189 2862 ################################################################################ 3190 ##### DData routines 2863 ##### DData routines - GUI stuff in GSASIIddataGUI.py 3191 2864 ################################################################################ 3192 3193 def UpdateDData():3194 G2frame.dataFrame.SetStatusText('')3195 UseList = data['Histograms']3196 if UseList:3197 G2frame.dataFrame.DataMenu.Enable(G2gd.wxID_DATADELETE,True)3198 for item in G2frame.Refine: item.Enable(True)3199 else:3200 G2frame.dataFrame.DataMenu.Enable(G2gd.wxID_DATADELETE,False)3201 for item in G2frame.Refine: item.Enable(False)3202 generalData = data['General']3203 SGData = generalData['SGData']3204 keyList = UseList.keys()3205 keyList.sort()3206 PWDR = any(['PWDR' in item for item in keyList])3207 Indx = {}3208 3209 def PlotSizer():3210 3211 def OnPlotSel(event):3212 Obj = event.GetEventObject()3213 generalData['Data plot type'] = Obj.GetStringSelection()3214 wx.CallAfter(UpdateDData)3215 G2plt.PlotSizeStrainPO(G2frame,data)3216 3217 def OnPOhkl(event):3218 Obj = event.GetEventObject()3219 Saxis = Obj.GetValue().split()3220 try:3221 hkl = [int(Saxis[i]) for i in range(3)]3222 except (ValueError,IndexError):3223 hkl = generalData['POhkl']3224 if not np.any(np.array(hkl)):3225 hkl = generalData['POhkl']3226 generalData['POhkl'] = hkl3227 h,k,l = hkl3228 Obj.SetValue('%3d %3d %3d'%(h,k,l))3229 G2plt.PlotSizeStrainPO(G2frame,data)3230 3231 plotSizer = wx.BoxSizer(wx.VERTICAL)3232 choice = ['None','Mustrain','Size','Preferred orientation']3233 plotSel = wx.RadioBox(DData,-1,'Select plot type:',choices=choice,3234 majorDimension=2,style=wx.RA_SPECIFY_COLS)3235 plotSel.SetStringSelection(generalData['Data plot type'])3236 plotSel.Bind(wx.EVT_RADIOBOX,OnPlotSel)3237 plotSizer.Add(plotSel)3238 if generalData['Data plot type'] == 'Preferred orientation':3239 POhklSizer = wx.BoxSizer(wx.HORIZONTAL)3240 POhklSizer.Add(wx.StaticText(DData,-1,' Plot preferred orientation for H K L: '),0,wx.ALIGN_CENTER_VERTICAL)3241 h,k,l = generalData['POhkl']3242 poAxis = wx.TextCtrl(DData,-1,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)3243 poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOhkl)3244 poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOhkl)3245 POhklSizer.Add(poAxis,0,wx.ALIGN_CENTER_VERTICAL)3246 plotSizer.Add(POhklSizer)3247 return plotSizer3248 3249 def ScaleSizer():3250 3251 def OnScaleRef(event):3252 Obj = event.GetEventObject()3253 UseList[Indx[Obj.GetId()]]['Scale'][1] = Obj.GetValue()3254 3255 def OnScaleVal(event):3256 Obj = event.GetEventObject()3257 try:3258 scale = float(Obj.GetValue())3259 if scale > 0:3260 UseList[Indx[Obj.GetId()]]['Scale'][0] = scale3261 except ValueError:3262 pass3263 Obj.SetValue("%.4f"%(UseList[Indx[Obj.GetId()]]['Scale'][0])) #reset in case of error3264 3265 scaleSizer = wx.BoxSizer(wx.HORIZONTAL)3266 if 'PWDR' in item:3267 scaleRef = wx.CheckBox(DData,-1,label=' Phase fraction: ')3268 elif 'HKLF' in item:3269 scaleRef = wx.CheckBox(DData,-1,label=' Scale factor: ')3270 scaleRef.SetValue(UseList[item]['Scale'][1])3271 Indx[scaleRef.GetId()] = item3272 scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)3273 scaleSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)3274 scaleVal = wx.TextCtrl(DData,wx.ID_ANY,3275 '%.4f'%(UseList[item]['Scale'][0]),style=wx.TE_PROCESS_ENTER)3276 Indx[scaleVal.GetId()] = item3277 scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)3278 scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)3279 scaleSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)3280 return scaleSizer3281 3282 def OnUseData(event):3283 Obj = event.GetEventObject()3284 hist = Indx[Obj.GetId()]3285 UseList[hist]['Use'] = Obj.GetValue()3286 3287 def OnShowData(event):3288 Obj = event.GetEventObject()3289 hist = Indx[Obj.GetId()]3290 UseList[hist]['Show'] = Obj.GetValue()3291 wx.CallAfter(UpdateDData)3292 G2plt.PlotSizeStrainPO(G2frame,data)3293 3294 def OnCopyData(event):3295 #how about HKLF data? This is only for PWDR data3296 Obj = event.GetEventObject()3297 hist = Indx[Obj.GetId()]3298 sourceDict = UseList[hist]3299 copyNames = ['Scale','Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet']3300 copyDict = {}3301 for name in copyNames:3302 copyDict[name] = copy.deepcopy(sourceDict[name]) #force copy3303 keyList = ['All',]+UseList.keys()3304 if UseList:3305 copyList = []3306 dlg = wx.MultiChoiceDialog(G2frame,3307 'Copy parameters to which histograms?', 'Copy parameters',3308 keyList, wx.CHOICEDLG_STYLE)3309 try:3310 if dlg.ShowModal() == wx.ID_OK:3311 result = dlg.GetSelections()3312 for i in result:3313 copyList.append(keyList[i])3314 if 'All' in copyList:3315 copyList = keyList[1:]3316 for item in copyList:3317 UseList[item].update(copy.deepcopy(copyDict))3318 wx.CallAfter(UpdateDData)3319 finally:3320 dlg.Destroy()3321 3322 def OnCopyFlags(event):3323 Obj = event.GetEventObject()3324 hist = Indx[Obj.GetId()]3325 sourceDict = UseList[hist]3326 copyDict = {}3327 copyNames = ['Scale','Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet']3328 babNames = ['BabA','BabU']3329 for name in copyNames:3330 if name in ['Scale','Extinction','HStrain']:3331 copyDict[name] = sourceDict[name][1]3332 elif name in ['Size','Mustrain']:3333 copyDict[name] = [sourceDict[name][0],sourceDict[name][2],sourceDict[name][4]]3334 elif name == 'Pref.Ori.':3335 copyDict[name] = [sourceDict[name][0],sourceDict[name][2]]3336 if sourceDict[name][0] == 'SH':3337 SHterms = sourceDict[name][5]3338 SHflags = {}3339 for item in SHterms:3340 SHflags[item] = SHterms[item][1]3341 copyDict[name].append(SHflags)3342 elif name == 'Babinet':3343 copyDict[name] = {}3344 for bab in babNames:3345 copyDict[name][bab] = sourceDict[name][bab][1]3346 keyList = ['All',]+UseList.keys()3347 if UseList:3348 copyList = []3349 dlg = wx.MultiChoiceDialog(G2frame,3350 'Copy parameters to which histograms?', 'Copy parameters',3351 keyList, wx.CHOICEDLG_STYLE)3352 try:3353 if dlg.ShowModal() == wx.ID_OK:3354 result = dlg.GetSelections()3355 for i in result:3356 copyList.append(keyList[i])3357 if 'All' in copyList:3358 copyList = keyList[1:]3359 for item in copyList:3360 UseList[item]3361 for name in copyNames:3362 if name in ['Scale','Extinction','HStrain']:3363 UseList[item][name][1] = copy.copy(copyDict[name])3364 elif name in ['Size','Mustrain']:3365 UseList[item][name][0] = copy.copy(copyDict[name][0])3366 UseList[item][name][2] = copy.copy(copyDict[name][1])3367 UseList[item][name][4] = copy.copy(copyDict[name][2])3368 elif name == 'Pref.Ori.':3369 UseList[item][name][0] = copy.copy(copyDict[name][0])3370 UseList[item][name][2] = copy.copy(copyDict[name][1])3371 if sourceDict[name][0] == 'SH':3372 SHflags = copy.copy(copyDict[name][2])3373 SHterms = copy.copy(sourceDict[name][5])3374 for item in SHflags:3375 SHterms[item][1] = copy.copy(SHflags[item])3376 elif name == 'Babinet':3377 for bab in babNames:3378 UseList[item][name][bab][1] = copy.copy(copyDict[name][bab])3379 wx.CallAfter(UpdateDData)3380 finally:3381 dlg.Destroy()3382 3383 3384 def OnLGmixRef(event):3385 Obj = event.GetEventObject()3386 hist,name = Indx[Obj.GetId()]3387 UseList[hist][name][2][2] = Obj.GetValue()3388 3389 def OnLGmixVal(event):3390 Obj = event.GetEventObject()3391 hist,name = Indx[Obj.GetId()]3392 try:3393 value = float(Obj.GetValue())3394 if 0.1 <= value <= 1:3395 UseList[hist][name][1][2] = value3396 else:3397 raise ValueError3398 except ValueError:3399 pass3400 Obj.SetValue("%.4f"%(UseList[hist][name][1][2])) #reset in case of error3401 3402 def OnSizeType(event):3403 Obj = event.GetEventObject()3404 hist = Indx[Obj.GetId()]3405 UseList[hist]['Size'][0] = Obj.GetValue()3406 G2plt.PlotSizeStrainPO(G2frame,data)3407 wx.CallAfter(UpdateDData)3408 3409 def OnSizeRef(event):3410 Obj = event.GetEventObject()3411 hist,pid = Indx[Obj.GetId()]3412 if UseList[hist]['Size'][0] == 'ellipsoidal':3413 UseList[hist]['Size'][5][pid] = Obj.GetValue()3414 else:3415 UseList[hist]['Size'][2][pid] = Obj.GetValue()3416 3417 def OnSizeVal(event):3418 Obj = event.GetEventObject()3419 hist,pid = Indx[Obj.GetId()]3420 if UseList[hist]['Size'][0] == 'ellipsoidal':3421 try:3422 size = float(Obj.GetValue())3423 if pid < 3 and size <= 0.001: #10A lower limit!3424 raise ValueError3425 UseList[hist]['Size'][4][pid] = size3426 except ValueError:3427 pass3428 Obj.SetValue("%.3f"%(UseList[hist]['Size'][4][pid])) #reset in case of error3429 else:3430 try:3431 size = float(Obj.GetValue())3432 if size <= 0.001: #10A lower limit!3433 raise ValueError3434 UseList[hist]['Size'][1][pid] = size3435 except ValueError:3436 pass3437 Obj.SetValue("%.3f"%(UseList[hist]['Size'][1][pid])) #reset in case of error3438 G2plt.PlotSizeStrainPO(G2frame,data)3439 3440 def OnSizeAxis(event):3441 Obj = event.GetEventObject()3442 hist = Indx[Obj.GetId()]3443 Saxis = Obj.GetValue().split()3444 try:3445 hkl = [int(Saxis[i]) for i in range(3)]3446 except (ValueError,IndexError):3447 hkl = UseList[hist]['Size'][3]3448 if not np.any(np.array(hkl)):3449 hkl = UseList[hist]['Size'][3]3450 UseList[hist]['Size'][3] = hkl3451 h,k,l = hkl3452 Obj.SetValue('%3d %3d %3d'%(h,k,l))3453 3454 def OnResetSize(event):3455 Obj = event.GetEventObject()3456 Obj.SetValue(False)3457 item,name = Indx[Obj.GetId()]3458 if name == 'isotropic':3459 UseList[item]['Size'][1][0] = 1.03460 elif name == 'uniaxial':3461 UseList[item]['Size'][1][0] = 1.03462 UseList[item]['Size'][1][1] = 1.03463 elif name == 'ellipsoidal':3464 for i in range(3):3465 UseList[item]['Size'][4][i] = 1.03466 UseList[item]['Size'][4][i+3] = 0.03467 G2plt.PlotSizeStrainPO(G2frame,data)3468 wx.CallAfter(UpdateDData)3469 3470 def OnStrainType(event):3471 Obj = event.GetEventObject()3472 hist = Indx[Obj.GetId()]3473 UseList[hist]['Mustrain'][0] = Obj.GetValue()3474 wx.CallAfter(UpdateDData)3475 G2plt.PlotSizeStrainPO(G2frame,data)3476 3477 def OnStrainRef(event):3478 Obj = event.GetEventObject()3479 hist,pid = Indx[Obj.GetId()]3480 if UseList[hist]['Mustrain'][0] == 'generalized':3481 UseList[hist]['Mustrain'][5][pid] = Obj.GetValue()3482 else:3483 UseList[hist]['Mustrain'][2][pid] = Obj.GetValue()3484 3485 def OnStrainVal(event):3486 Snames = G2spc.MustrainNames(SGData)3487 Obj = event.GetEventObject()3488 hist,pid = Indx[Obj.GetId()]3489 try:3490 strain = float(Obj.GetValue())3491 if UseList[hist]['Mustrain'][0] == 'generalized':3492 if '4' in Snames[pid] and strain < 0:3493 raise ValueError3494 UseList[hist]['Mustrain'][4][pid] = strain3495 else:3496 if strain <= 0:3497 raise ValueError3498 UseList[hist]['Mustrain'][1][pid] = strain3499 except ValueError:3500 pass3501 if UseList[hist]['Mustrain'][0] == 'generalized':3502 Obj.SetValue("%.3f"%(UseList[hist]['Mustrain'][4][pid])) #reset in case of error3503 else:3504 Obj.SetValue("%.1f"%(UseList[hist]['Mustrain'][1][pid])) #reset in case of error3505 G2plt.PlotSizeStrainPO(G2frame,data)3506 3507 def OnStrainAxis(event):3508 Obj = event.GetEventObject()3509 hist = Indx[Obj.GetId()]3510 Saxis = Obj.GetValue().split()3511 try:3512 hkl = [int(Saxis[i]) for i in range(3)]3513 except (ValueError,IndexError):3514 hkl = UseList[hist]['Mustrain'][3]3515 if not np.any(np.array(hkl)):3516 hkl = UseList[hist]['Mustrain'][3]3517 UseList[hist]['Mustrain'][3] = hkl3518 h,k,l = hkl3519 Obj.SetValue('%3d %3d %3d'%(h,k,l))3520 G2plt.PlotSizeStrainPO(G2frame,data)3521 3522 def OnResetStrain(event):3523 Obj = event.GetEventObject()3524 Obj.SetValue(False)3525 item,name = Indx[Obj.GetId()]3526 if name == 'isotropic':3527 UseList[item]['Mustrain'][1][0] = 1000.03528 elif name == 'uniaxial':3529 UseList[item]['Mustrain'][1][0] = 1000.03530 UseList[item]['Mustrain'][1][1] = 1000.03531 elif name == 'generalized':3532 nTerm = len(UseList[item]['Mustrain'][4])3533 for i in range(nTerm):3534 UseList[item]['Mustrain'][4][i] = 0.013535 wx.CallAfter(UpdateDData)3536 G2plt.PlotSizeStrainPO(G2frame,data)3537 3538 def OnHstrainRef(event):3539 Obj = event.GetEventObject()3540 hist,pid = Indx[Obj.GetId()]3541 UseList[hist]['HStrain'][1][pid] = Obj.GetValue()3542 3543 def OnHstrainVal(event):3544 Snames = G2spc.HStrainNames(SGData)3545 Obj = event.GetEventObject()3546 hist,pid = Indx[Obj.GetId()]3547 try:3548 strain = float(Obj.GetValue())3549 UseList[hist]['HStrain'][0][pid] = strain3550 except ValueError:3551 pass3552 Obj.SetValue("%.5f"%(UseList[hist]['HStrain'][0][pid])) #reset in case of error3553 3554 def OnPOVal(event):3555 Obj = event.GetEventObject()3556 hist = Indx[Obj.GetId()]3557 try:3558 mdVal = float(Obj.GetValue())3559 if mdVal > 0:3560 UseList[hist]['Pref.Ori.'][1] = mdVal3561 except ValueError:3562 pass3563 Obj.SetValue("%.3f"%(UseList[hist]['Pref.Ori.'][1])) #reset in case of error3564 3565 def OnPOAxis(event):3566 Obj = event.GetEventObject()3567 hist = Indx[Obj.GetId()]3568 Saxis = Obj.GetValue().split()3569 try:3570 hkl = [int(Saxis[i]) for i in range(3)]3571 except (ValueError,IndexError):3572 hkl = UseList[hist]['Pref.Ori.'][3]3573 if not np.any(np.array(hkl)):3574 hkl = UseList[hist]['Pref.Ori.'][3]3575 UseList[hist]['Pref.Ori.'][3] = hkl3576 h,k,l = hkl3577 Obj.SetValue('%3d %3d %3d'%(h,k,l))3578 3579 def OnPOOrder(event):3580 Obj = event.GetEventObject()3581 hist = Indx[Obj.GetId()]3582 Order = int(Obj.GetValue())3583 UseList[hist]['Pref.Ori.'][4] = Order3584 UseList[hist]['Pref.Ori.'][5] = SetPOCoef(Order,hist)3585 wx.CallAfter(UpdateDData)3586 3587 def OnPOType(event):3588 Obj = event.GetEventObject()3589 hist = Indx[Obj.GetId()]3590 if 'March' in Obj.GetValue():3591 UseList[hist]['Pref.Ori.'][0] = 'MD'3592 else:3593 UseList[hist]['Pref.Ori.'][0] = 'SH'3594 wx.CallAfter(UpdateDData)3595 3596 def OnPORef(event):3597 Obj = event.GetEventObject()3598 hist = Indx[Obj.GetId()]3599 UseList[hist]['Pref.Ori.'][2] = Obj.GetValue()3600 3601 def SetPOCoef(Order,hist):3602 cofNames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',Order,False) #cylindrical & no M3603 newPOCoef = dict(zip(cofNames,np.zeros(len(cofNames))))3604 POCoeff = UseList[hist]['Pref.Ori.'][5]3605 for cofName in POCoeff:3606 if cofName in cofNames:3607 newPOCoef[cofName] = POCoeff[cofName]3608 return newPOCoef3609 3610 def OnExtRef(event):3611 Obj = event.GetEventObject()3612 UseList[Indx[Obj.GetId()]]['Extinction'][1] = Obj.GetValue()3613 3614 def OnExtVal(event):3615 Obj = event.GetEventObject()3616 try:3617 ext = float(Obj.GetValue())3618 if ext >= 0:3619 UseList[Indx[Obj.GetId()]]['Extinction'][0] = ext3620 except ValueError:3621 pass3622 Obj.SetValue("%.2f"%(UseList[Indx[Obj.GetId()]]['Extinction'][0]))3623 3624 def OnBabRef(event):3625 Obj = event.GetEventObject()3626 item,bab = Indx[Obj.GetId()]3627 UseList[item]['Babinet']['Bab'+bab][1] = Obj.GetValue()3628 3629 def OnBabVal(event):3630 Obj = event.GetEventObject()3631 item,bab = Indx[Obj.GetId()]3632 try:3633 val = float(Obj.GetValue())3634 if val >= 0:3635 UseList[item]['Babinet']['Bab'+bab][0] = val3636 except ValueError:3637 pass3638 Obj.SetValue("%.3f"%(UseList[item]['Babinet']['Bab'+bab][0]))3639 3640 def OnTbarVal(event):3641 Obj = event.GetEventObject()3642 try:3643 tbar = float(Obj.GetValue())3644 if tbar > 0:3645 UseList[Indx[Obj.GetId()]]['Extinction'][2]['Tbar'] = tbar3646 except ValueError:3647 pass3648 Obj.SetValue("%.3f"%(UseList[Indx[Obj.GetId()]]['Extinction'][2]['Tbar']))3649 3650 def OnCos2TM(event):3651 Obj = event.GetEventObject()3652 try:3653 val = float(Obj.GetValue())3654 if 0. < val <= 1.:3655 UseList[Indx[Obj.GetId()]]['Extinction'][2]['Cos2TM'] = val3656 except ValueError:3657 pass3658 Obj.SetValue("%.3f"%(UseList[Indx[Obj.GetId()]]['Extinction'][2]['Cos2TM']))3659 3660 def OnEval(event):3661 Obj = event.GetEventObject()3662 item = Indx[Obj.GetId()]3663 try:3664 val = float(Obj.GetValue())3665 if val > 0:3666 UseList[item[0]]['Extinction'][2][item[1]][0] = val3667 except ValueError:3668 pass3669 Obj.SetValue("%10.3e"%(UseList[item[0]]['Extinction'][2][item[1]][0]))3670 3671 def OnEref(event):3672 Obj = event.GetEventObject()3673 item = Indx[Obj.GetId()]3674 UseList[item[0]]['Extinction'][2][item[1]][1] = Obj.GetValue()3675 3676 def OnSCExtType(event):3677 Obj = event.GetEventObject()3678 item = Indx[Obj.GetId()]3679 UseList[item[0]]['Extinction'][item[1]] = Obj.GetValue()3680 wx.CallAfter(UpdateDData)3681 3682 def checkAxis(axis):3683 if not np.any(np.array(axis)):3684 return False3685 return axis3686 3687 def TopSizer(name,choices,parm,OnType):3688 topSizer = wx.BoxSizer(wx.HORIZONTAL)3689 topSizer.Add(wx.StaticText(DData,-1,name),0,wx.ALIGN_CENTER_VERTICAL)3690 sizeType = wx.ComboBox(DData,wx.ID_ANY,value=UseList[item][parm][0],choices=choices,3691 style=wx.CB_READONLY|wx.CB_DROPDOWN)3692 sizeType.Bind(wx.EVT_COMBOBOX, OnType)3693 Indx[sizeType.GetId()] = item3694 topSizer.Add(sizeType)3695 topSizer.Add((5,0),0)3696 return topSizer3697 3698 def LGmixSizer(name,OnVal,OnRef):3699 lgmixSizer = wx.BoxSizer(wx.HORIZONTAL)3700 lgmixRef = wx.CheckBox(DData,-1,label='LGmix')3701 lgmixRef.thisown = False3702 lgmixRef.SetValue(UseList[item][name][2][2])3703 Indx[lgmixRef.GetId()] = [item,name]3704 lgmixRef.Bind(wx.EVT_CHECKBOX, OnRef)3705 lgmixSizer.Add(lgmixRef,0,wx.ALIGN_CENTER_VERTICAL)3706 lgmixVal = wx.TextCtrl(DData,wx.ID_ANY,3707 '%.4f'%(UseList[item][name][1][2]),style=wx.TE_PROCESS_ENTER)3708 Indx[lgmixVal.GetId()] = [item,name]3709 lgmixVal.Bind(wx.EVT_TEXT_ENTER,OnVal)3710 lgmixVal.Bind(wx.EVT_KILL_FOCUS,OnVal)3711 lgmixSizer.Add(lgmixVal,0,wx.ALIGN_CENTER_VERTICAL)3712 return lgmixSizer3713 3714 def ResetSizer(name,OnReset):3715 resetSizer = wx.BoxSizer(wx.HORIZONTAL)3716 resetSizer.Add((5,0),0)3717 reset = wx.CheckBox(DData,-1,label='Reset?')3718 reset.thisown = False3719 reset.SetValue(False)3720 Indx[reset.GetId()] = [item,name]3721 reset.Bind(wx.EVT_CHECKBOX,OnReset)3722 resetSizer.Add(reset,0,wx.ALIGN_CENTER_VERTICAL)3723 return resetSizer3724 3725 def IsoSizer(name,parm,fmt,OnVal,OnRef):3726 isoSizer = wx.BoxSizer(wx.HORIZONTAL)3727 sizeRef = wx.CheckBox(DData,-1,label=name)3728 sizeRef.thisown = False3729 sizeRef.SetValue(UseList[item][parm][2][0])3730 Indx[sizeRef.GetId()] = [item,0]3731 sizeRef.Bind(wx.EVT_CHECKBOX, OnRef)3732 isoSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)3733 sizeVal = wx.TextCtrl(DData,wx.ID_ANY,3734 fmt%(UseList[item][parm][1][0]),style=wx.TE_PROCESS_ENTER)3735 Indx[sizeVal.GetId()] = [item,0]3736 sizeVal.Bind(wx.EVT_TEXT_ENTER,OnVal)3737 sizeVal.Bind(wx.EVT_KILL_FOCUS,OnVal)3738 isoSizer.Add(sizeVal,0,wx.ALIGN_CENTER_VERTICAL)3739 return isoSizer3740 3741 def UniSizer(parm,OnAxis):3742 uniSizer = wx.BoxSizer(wx.HORIZONTAL)3743 uniSizer.Add(wx.StaticText(DData,-1,' Unique axis, H K L: '),0,wx.ALIGN_CENTER_VERTICAL)3744 h,k,l = UseList[item][parm][3]3745 Axis = wx.TextCtrl(DData,-1,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)3746 Indx[Axis.GetId()] = item3747 Axis.Bind(wx.EVT_TEXT_ENTER,OnAxis)3748 Axis.Bind(wx.EVT_KILL_FOCUS,OnAxis)3749 uniSizer.Add(Axis,0,wx.ALIGN_CENTER_VERTICAL)3750 return uniSizer3751 3752 def UniDataSizer(parmName,parm,fmt,OnVal,OnRef):3753 dataSizer = wx.BoxSizer(wx.HORIZONTAL)3754 parms = zip([' Equatorial '+parmName,' Axial '+parmName],3755 UseList[item][parm][1],UseList[item][parm][2],range(2))3756 for Pa,val,ref,id in parms:3757 sizeRef = wx.CheckBox(DData,-1,label=Pa)3758 sizeRef.thisown = False3759 sizeRef.SetValue(ref)3760 Indx[sizeRef.GetId()] = [item,id]3761 sizeRef.Bind(wx.EVT_CHECKBOX, OnRef)3762 dataSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)3763 sizeVal = wx.TextCtrl(DData,wx.ID_ANY,fmt%(val),style=wx.TE_PROCESS_ENTER)3764 Indx[sizeVal.GetId()] = [item,id]3765 sizeVal.Bind(wx.EVT_TEXT_ENTER,OnVal)3766 sizeVal.Bind(wx.EVT_KILL_FOCUS,OnVal)3767 dataSizer.Add(sizeVal,0,wx.ALIGN_CENTER_VERTICAL)3768 dataSizer.Add((5,0),0)3769 return dataSizer3770 3771 def EllSizeDataSizer():3772 parms = zip(['S11','S22','S33','S12','S13','S23'],UseList[item]['Size'][4],3773 UseList[item]['Size'][5],range(6))3774 dataSizer = wx.FlexGridSizer(1,6,5,5)3775 for Pa,val,ref,id in parms:3776 sizeRef = wx.CheckBox(DData,-1,label=Pa)3777 sizeRef.thisown = False3778 sizeRef.SetValue(ref)3779 Indx[sizeRef.GetId()] = [item,id]3780 sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)3781 dataSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)3782 sizeVal = wx.TextCtrl(DData,wx.ID_ANY,'%.3f'%(val),style=wx.TE_PROCESS_ENTER)3783 Indx[sizeVal.GetId()] = [item,id]3784 sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)3785 sizeVal.Bind(wx.EVT_KILL_FOCUS,OnSizeVal)3786 dataSizer.Add(sizeVal,0,wx.ALIGN_CENTER_VERTICAL)3787 return dataSizer3788 3789 def GenStrainDataSizer():3790 Snames = G2spc.MustrainNames(SGData)3791 numb = len(Snames)3792 if len(UseList[item]['Mustrain'][4]) < numb:3793 UseList[item]['Mustrain'][4] = numb*[0.0,]3794 UseList[item]['Mustrain'][5] = numb*[False,]3795 parms = zip(Snames,UseList[item]['Mustrain'][4],UseList[item]['Mustrain'][5],range(numb))3796 dataSizer = wx.FlexGridSizer(1,6,5,5)3797 for Pa,val,ref,id in parms:3798 strainRef = wx.CheckBox(DData,-1,label=Pa)3799 strainRef.thisown = False3800 strainRef.SetValue(ref)3801 Indx[strainRef.GetId()] = [item,id]3802 strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)3803 dataSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)3804 strainVal = wx.TextCtrl(DData,wx.ID_ANY,'%.5f'%(val),style=wx.TE_PROCESS_ENTER)3805 Indx[strainVal.GetId()] = [item,id]3806 strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)3807 strainVal.Bind(wx.EVT_KILL_FOCUS,OnStrainVal)3808 dataSizer.Add(strainVal,0,wx.ALIGN_CENTER_VERTICAL)3809 return dataSizer3810 3811 def HstrainSizer():3812 hstrainSizer = wx.FlexGridSizer(1,6,5,5)3813 Hsnames = G2spc.HStrainNames(SGData)3814 parms = zip(Hsnames,UseList[item]['HStrain'][0],UseList[item]['HStrain'][1],range(len(Hsnames)))3815 for Pa,val,ref,id in parms:3816 hstrainRef = wx.CheckBox(DData,-1,label=Pa)3817 hstrainRef.thisown = False3818 hstrainRef.SetValue(ref)3819 Indx[hstrainRef.GetId()] = [item,id]3820 hstrainRef.Bind(wx.EVT_CHECKBOX, OnHstrainRef)3821 hstrainSizer.Add(hstrainRef,0,wx.ALIGN_CENTER_VERTICAL)3822 hstrainVal = wx.TextCtrl(DData,wx.ID_ANY,'%.5f'%(val),style=wx.TE_PROCESS_ENTER)3823 Indx[hstrainVal.GetId()] = [item,id]3824 hstrainVal.Bind(wx.EVT_TEXT_ENTER,OnHstrainVal)3825 hstrainVal.Bind(wx.EVT_KILL_FOCUS,OnHstrainVal)3826 hstrainSizer.Add(hstrainVal,0,wx.ALIGN_CENTER_VERTICAL)3827 return hstrainSizer3828 3829 def PoTopSizer(POData):3830 poSizer = wx.FlexGridSizer(1,6,5,5)3831 choice = ['March-Dollase','Spherical harmonics']3832 POtype = choice[['MD','SH'].index(POData[0])]3833 poSizer.Add(wx.StaticText(DData,-1,' Preferred orientation model '),0,wx.ALIGN_CENTER_VERTICAL)3834 POType = wx.ComboBox(DData,wx.ID_ANY,value=POtype,choices=choice,3835 style=wx.CB_READONLY|wx.CB_DROPDOWN)3836 Indx[POType.GetId()] = item3837 POType.Bind(wx.EVT_COMBOBOX, OnPOType)3838 poSizer.Add(POType)3839 if POData[0] == 'SH':3840 poSizer.Add(wx.StaticText(DData,-1,' Harmonic order: '),0,wx.ALIGN_CENTER_VERTICAL)3841 poOrder = wx.ComboBox(DData,wx.ID_ANY,value=str(POData[4]),choices=[str(2*i) for i in range(18)],3842 style=wx.CB_READONLY|wx.CB_DROPDOWN)3843 Indx[poOrder.GetId()] = item3844 poOrder.Bind(wx.EVT_COMBOBOX,OnPOOrder)3845 poSizer.Add(poOrder,0,wx.ALIGN_CENTER_VERTICAL)3846 poRef = wx.CheckBox(DData,-1,label=' Refine? ')3847 poRef.SetValue(POData[2])3848 Indx[poRef.GetId()] = item3849 poRef.Bind(wx.EVT_CHECKBOX,OnPORef)3850 poSizer.Add(poRef,0,wx.ALIGN_CENTER_VERTICAL)3851 return poSizer3852 3853 def MDDataSizer(POData):3854 poSizer = wx.BoxSizer(wx.HORIZONTAL)3855 poRef = wx.CheckBox(DData,-1,label=' March-Dollase ratio: ')3856 poRef.SetValue(POData[2])3857 Indx[poRef.GetId()] = item3858 poRef.Bind(wx.EVT_CHECKBOX,OnPORef)3859 poSizer.Add(poRef,0,wx.ALIGN_CENTER_VERTICAL)3860 poVal = wx.TextCtrl(DData,wx.ID_ANY,3861 '%.3f'%(POData[1]),style=wx.TE_PROCESS_ENTER)3862 Indx[poVal.GetId()] = item3863 poVal.Bind(wx.EVT_TEXT_ENTER,OnPOVal)3864 poVal.Bind(wx.EVT_KILL_FOCUS,OnPOVal)3865 poSizer.Add(poVal,0,wx.ALIGN_CENTER_VERTICAL)3866 poSizer.Add(wx.StaticText(DData,-1,' Unique axis, H K L: '),0,wx.ALIGN_CENTER_VERTICAL)3867 h,k,l =POData[3]3868 poAxis = wx.TextCtrl(DData,-1,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)3869 Indx[poAxis.GetId()] = item3870 poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOAxis)3871 poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOAxis)3872 poSizer.Add(poAxis,0,wx.ALIGN_CENTER_VERTICAL)3873 return poSizer3874 3875 def SHDataSizer(POData):3876 textJ = G2lat.textureIndex(POData[5])3877 mainSizer.Add(wx.StaticText(DData,-1,' Spherical harmonic coefficients: '+'Texture index: %.3f'%(textJ)),0,wx.ALIGN_CENTER_VERTICAL)3878 mainSizer.Add((0,5),0)3879 ODFSizer = wx.FlexGridSizer(2,8,2,2)3880 ODFIndx = {}3881 ODFkeys = POData[5].keys()3882 ODFkeys.sort()3883 for odf in ODFkeys:3884 ODFSizer.Add(wx.StaticText(DData,-1,odf),0,wx.ALIGN_CENTER_VERTICAL)3885 ODFval = wx.TextCtrl(DData,wx.ID_ANY,'%8.3f'%(POData[5][odf]),style=wx.TE_PROCESS_ENTER)3886 ODFIndx[ODFval.GetId()] = odf3887 # ODFval.Bind(wx.EVT_TEXT_ENTER,OnODFValue)3888 # ODFval.Bind(wx.EVT_KILL_FOCUS,OnODFValue)3889 ODFSizer.Add(ODFval,0,wx.ALIGN_CENTER_VERTICAL)3890 return ODFSizer3891 3892 def ExtSizer():3893 extSizer = wx.BoxSizer(wx.HORIZONTAL)3894 extRef = wx.CheckBox(DData,-1,label=' Extinction: ')3895 extRef.SetValue(UseList[item]['Extinction'][1])3896 Indx[extRef.GetId()] = item3897 extRef.Bind(wx.EVT_CHECKBOX, OnExtRef)3898 extSizer.Add(extRef,0,wx.ALIGN_CENTER_VERTICAL)3899 extVal = wx.TextCtrl(DData,wx.ID_ANY,3900 '%.2f'%(UseList[item]['Extinction'][0]),style=wx.TE_PROCESS_ENTER)3901 Indx[extVal.GetId()] = item3902 extVal.Bind(wx.EVT_TEXT_ENTER,OnExtVal)3903 extVal.Bind(wx.EVT_KILL_FOCUS,OnExtVal)3904 extSizer.Add(extVal,0,wx.ALIGN_CENTER_VERTICAL)3905 return extSizer3906 3907 def SCExtSizer():3908 extSizer = wx.BoxSizer(wx.VERTICAL)3909 typeSizer = wx.BoxSizer(wx.HORIZONTAL)3910 typeSizer.Add(wx.StaticText(DData,-1,' Extinction type: '),0,wx.ALIGN_CENTER_VERTICAL)3911 Choices = ['None','Primary','Secondary Type I','Secondary Type II','Secondary Type I & II']3912 typeTxt = wx.ComboBox(DData,-1,choices=Choices,value=UseList[item]['Extinction'][1],3913 style=wx.CB_READONLY|wx.CB_DROPDOWN)3914 Indx[typeTxt.GetId()] = [item,1]3915 typeTxt.Bind(wx.EVT_COMBOBOX,OnSCExtType)3916 typeSizer.Add(typeTxt)3917 typeSizer.Add(wx.StaticText(DData,-1,' Approx: '),0,wx.ALIGN_CENTER_VERTICAL)3918 Choices=['Lorentzian','Gaussian']3919 approxTxT = wx.ComboBox(DData,-1,choices=Choices,value=UseList[item]['Extinction'][0],3920 style=wx.CB_READONLY|wx.CB_DROPDOWN)3921 Indx[approxTxT.GetId()] = [item,0]3922 approxTxT.Bind(wx.EVT_COMBOBOX,OnSCExtType)3923 typeSizer.Add(approxTxT)3924 extSizer.Add(typeSizer,0,wx.ALIGN_CENTER_VERTICAL)3925 if UseList[item]['Extinction'][1] != 'None':3926 extSizer.Add((0,5),)3927 valSizer =wx.BoxSizer(wx.HORIZONTAL)3928 valSizer.Add(wx.StaticText(DData,-1,' Tbar(mm):'),0,wx.ALIGN_CENTER_VERTICAL)3929 tbarVal = wx.TextCtrl(DData,wx.ID_ANY,3930 '%.3f'%(UseList[item]['Extinction'][2]['Tbar']),style=wx.TE_PROCESS_ENTER)3931 Indx[tbarVal.GetId()] = item3932 tbarVal.Bind(wx.EVT_TEXT_ENTER,OnTbarVal)3933 tbarVal.Bind(wx.EVT_KILL_FOCUS,OnTbarVal)3934 valSizer.Add(tbarVal,0,wx.ALIGN_CENTER_VERTICAL)3935 valSizer.Add(wx.StaticText(DData,-1,' cos(2ThM):'),0,wx.ALIGN_CENTER_VERTICAL)3936 cos2tm = wx.TextCtrl(DData,wx.ID_ANY,3937 '%.3f'%(UseList[item]['Extinction'][2]['Cos2TM']),style=wx.TE_PROCESS_ENTER)3938 Indx[cos2tm.GetId()] = item3939 cos2tm.Bind(wx.EVT_TEXT_ENTER,OnCos2TM)3940 cos2tm.Bind(wx.EVT_KILL_FOCUS,OnCos2TM)3941 valSizer.Add(cos2tm,0,wx.ALIGN_CENTER_VERTICAL)3942 extSizer.Add(valSizer,0,wx.ALIGN_CENTER_VERTICAL)3943 val2Sizer =wx.BoxSizer(wx.HORIZONTAL)3944 if 'Primary' in UseList[item]['Extinction'][1]:3945 Ekey = ['Ep',]3946 elif 'Secondary Type II' == UseList[item]['Extinction'][1]:3947 Ekey = ['Es',]3948 elif 'Secondary Type I' == UseList[item]['Extinction'][1]:3949 Ekey = ['Eg',]3950 else:3951 Ekey = ['Eg','Es']3952 for ekey in Ekey:3953 Eref = wx.CheckBox(DData,-1,label=ekey+' : ')3954 Eref.SetValue(UseList[item]['Extinction'][2][ekey][1])3955 Indx[Eref.GetId()] = [item,ekey]3956 Eref.Bind(wx.EVT_CHECKBOX, OnEref)3957 val2Sizer.Add(Eref,0,wx.ALIGN_CENTER_VERTICAL)3958 Eval = wx.TextCtrl(DData,wx.ID_ANY,3959 '%10.3e'%(UseList[item]['Extinction'][2][ekey][0]),style=wx.TE_PROCESS_ENTER)3960 Indx[Eval.GetId()] = [item,ekey]3961 Eval.Bind(wx.EVT_TEXT_ENTER,OnEval)3962 Eval.Bind(wx.EVT_KILL_FOCUS,OnEval)3963 val2Sizer.Add(Eval,0,wx.ALIGN_CENTER_VERTICAL)3964 3965 extSizer.Add(val2Sizer,0,wx.ALIGN_CENTER_VERTICAL)3966 return extSizer3967 3968 def BabSizer():3969 babSizer = wx.BoxSizer(wx.HORIZONTAL)3970 for bab in ['A','U']:3971 babRef = wx.CheckBox(DData,-1,label=' Babinet '+bab+': ')3972 babRef.SetValue(UseList[item]['Babinet']['Bab'+bab][1])3973 Indx[babRef.GetId()] = [item,bab]3974 babRef.Bind(wx.EVT_CHECKBOX, OnBabRef)3975 babSizer.Add(babRef,0,wx.ALIGN_CENTER_VERTICAL)3976 babVal = wx.TextCtrl(DData,wx.ID_ANY,3977 '%.3f'%(UseList[item]['Babinet']['Bab'+bab][0]),style=wx.TE_PROCESS_ENTER)3978 Indx[babVal.GetId()] = [item,bab]3979 babVal.Bind(wx.EVT_TEXT_ENTER,OnBabVal)3980 babVal.Bind(wx.EVT_KILL_FOCUS,OnBabVal)3981 babSizer.Add(babVal,0,wx.ALIGN_CENTER_VERTICAL)3982 babSizer.Add((5,5),0)3983 return babSizer3984 3985 if DData.GetSizer():3986 DData.GetSizer().Clear(True)3987 mainSizer = wx.BoxSizer(wx.VERTICAL)3988 mainSizer.Add(wx.StaticText(DData,-1,'Histogram data for '+PhaseName+':'),0,wx.ALIGN_CENTER_VERTICAL)3989 if PWDR:3990 mainSizer.Add(PlotSizer())3991 3992 for item in keyList:3993 histData = UseList[item]3994 if 'Use' not in UseList[item]: #patch3995 UseList[item]['Use'] = True3996 if 'Babinet' not in UseList[item]:3997 UseList[item]['Babinet'] = {'BabA':[0.0,False],'BabU':[0.0,False]}3998 showSizer = wx.BoxSizer(wx.HORIZONTAL)3999 showData = wx.CheckBox(DData,-1,label=' Show '+item)4000 showData.SetValue(UseList[item]['Show'])4001 Indx[showData.GetId()] = item4002 showData.Bind(wx.EVT_CHECKBOX, OnShowData)4003 showSizer.Add(showData,0,wx.ALIGN_CENTER_VERTICAL)4004 useData = wx.CheckBox(DData,-1,label='Use?')4005 Indx[useData.GetId()] = item4006 showSizer.Add(useData,0,wx.ALIGN_CENTER_VERTICAL)4007 useData.Bind(wx.EVT_CHECKBOX, OnUseData)4008 useData.SetValue(UseList[item]['Use'])4009 copyData = wx.Button(DData,-1,label=' Copy?')4010 Indx[copyData.GetId()] = item4011 copyData.Bind(wx.EVT_BUTTON,OnCopyData)4012 showSizer.Add(copyData,wx.ALIGN_CENTER_VERTICAL)4013 copyFlags = wx.Button(DData,-1,label=' Copy flags?')4014 Indx[copyFlags.GetId()] = item4015 copyFlags.Bind(wx.EVT_BUTTON,OnCopyFlags)4016 showSizer.Add(copyFlags,wx.ALIGN_CENTER_VERTICAL)4017 mainSizer.Add((5,5),0)4018 mainSizer.Add(showSizer,0,wx.ALIGN_CENTER_VERTICAL)4019 mainSizer.Add((0,5),0)4020 4021 if UseList[item]['Show']:4022 mainSizer.Add(ScaleSizer())4023 mainSizer.Add((0,5),0)4024 4025 if item[:4] == 'PWDR' and UseList[item]['Show']:4026 if UseList[item]['Size'][0] == 'isotropic':4027 isoSizer = wx.BoxSizer(wx.HORIZONTAL)4028 isoSizer.Add(TopSizer(' Size model: ',['isotropic','uniaxial','ellipsoidal'],4029 'Size',OnSizeType),0,wx.ALIGN_CENTER_VERTICAL)4030 isoSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))4031 isoSizer.Add(ResetSizer('isotropic',OnResetSize),0,wx.ALIGN_CENTER_VERTICAL)4032 mainSizer.Add(isoSizer)4033 mainSizer.Add(IsoSizer(u' Cryst. size(\xb5m): ','Size','%.3f',4034 OnSizeVal,OnSizeRef),0,wx.ALIGN_CENTER_VERTICAL)4035 elif UseList[item]['Size'][0] == 'uniaxial':4036 uniSizer = wx.BoxSizer(wx.HORIZONTAL)4037 uniSizer.Add(TopSizer(' Size model: ',['isotropic','uniaxial','ellipsoidal'],4038 'Size',OnSizeType),0,wx.ALIGN_CENTER_VERTICAL)4039 uniSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))4040 uniSizer.Add(ResetSizer('uniaxial',OnResetSize),0,wx.ALIGN_CENTER_VERTICAL)4041 mainSizer.Add(UniSizer('Size',OnSizeAxis),0,wx.ALIGN_CENTER_VERTICAL)4042 mainSizer.Add(uniSizer)4043 mainSizer.Add(UniDataSizer(u'size(\xb5m): ','Size','%.3f',OnSizeVal,OnSizeRef))4044 elif UseList[item]['Size'][0] == 'ellipsoidal':4045 ellSizer = wx.BoxSizer(wx.HORIZONTAL)4046 ellSizer.Add(TopSizer(' Size model: ',['isotropic','uniaxial','ellipsoidal'],4047 'Size',OnSizeType),0,wx.ALIGN_CENTER_VERTICAL)4048 ellSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))4049 ellSizer.Add(ResetSizer('ellipsoidal',OnResetSize),0,wx.ALIGN_CENTER_VERTICAL)4050 mainSizer.Add(ellSizer)4051 mainSizer.Add(EllSizeDataSizer())4052 mainSizer.Add((0,5),0)4053 4054 if UseList[item]['Mustrain'][0] == 'isotropic':4055 isoSizer = wx.BoxSizer(wx.HORIZONTAL)4056 isoSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],4057 'Mustrain',OnStrainType),0,wx.ALIGN_CENTER_VERTICAL)4058 isoSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))4059 isoSizer.Add(ResetSizer('isotropic',OnResetStrain),0,wx.ALIGN_CENTER_VERTICAL)4060 mainSizer.Add(isoSizer)4061 mainSizer.Add(IsoSizer(' microstrain: ','Mustrain','%.1f',4062 OnStrainVal,OnStrainRef),0,wx.ALIGN_CENTER_VERTICAL)4063 mainSizer.Add((0,5),0)4064 elif UseList[item]['Mustrain'][0] == 'uniaxial':4065 uniSizer = wx.BoxSizer(wx.HORIZONTAL)4066 uniSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],4067 'Mustrain',OnStrainType),0,wx.ALIGN_CENTER_VERTICAL)4068 uniSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))4069 uniSizer.Add(ResetSizer('uniaxial',OnResetStrain),0,wx.ALIGN_CENTER_VERTICAL)4070 mainSizer.Add(uniSizer)4071 mainSizer.Add(UniSizer('Mustrain',OnStrainAxis),0,wx.ALIGN_CENTER_VERTICAL)4072 mainSizer.Add(UniDataSizer('mustrain: ','Mustrain','%.1f',OnStrainVal,OnStrainRef))4073 elif UseList[item]['Mustrain'][0] == 'generalized':4074 genSizer = wx.BoxSizer(wx.HORIZONTAL)4075 genSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],4076 'Mustrain',OnStrainType),0,wx.ALIGN_CENTER_VERTICAL)4077 genSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))4078 genSizer.Add(ResetSizer('generalized',OnResetStrain),0,wx.ALIGN_CENTER_VERTICAL)4079 mainSizer.Add(genSizer)4080 mainSizer.Add(GenStrainDataSizer())4081 mainSizer.Add((0,5),0)4082 4083 mainSizer.Add(wx.StaticText(DData,-1,' Hydrostatic/elastic strain:'))4084 mainSizer.Add(HstrainSizer())4085 4086 #texture 'Pref. Ori.':['MD',1.0,False,[0,0,1],0,[]] last two for 'SH' are SHorder & coeff4087 poSizer = wx.BoxSizer(wx.VERTICAL)4088 POData = UseList[item]['Pref.Ori.']4089 poSizer.Add(PoTopSizer(POData))4090 if POData[0] == 'MD':4091 poSizer.Add(MDDataSizer(POData))4092 else: #'SH'4093 if POData[4]: #SH order > 04094 poSizer.Add(SHDataSizer(POData))4095 4096 mainSizer.Add(poSizer)4097 mainSizer.Add((0,5),0)4098 mainSizer.Add(ExtSizer())4099 mainSizer.Add((0,5),0)4100 mainSizer.Add(BabSizer())4101 mainSizer.Add((0,5),0)4102 elif item[:4] == 'HKLF' and UseList[item]['Show']:4103 mainSizer.Add((0,5),0)4104 mainSizer.Add(SCExtSizer())4105 mainSizer.Add((0,5),0)4106 mainSizer.Add(BabSizer())4107 mainSizer.Add((0,5),0)4108 pass4109 mainSizer.Add(wx.StaticText(DData,-1,150*'-'),0,)4110 mainSizer.Add((5,5),0)4111 4112 DData.SetSizer(mainSizer,True)4113 mainSizer.FitInside(G2frame.dataFrame)4114 Size = mainSizer.GetMinSize()4115 Size[0] += 404116 Size[1] = max(Size[1],290) + 354117 DData.SetSize(Size)4118 DData.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)4119 Size[1] = min(Size[1],450)4120 G2frame.dataFrame.setSizePosLeft(Size)4121 2865 4122 2866 def OnHklfAdd(event): … … 4145 2889 UpdateHKLFdata(histoName) 4146 2890 wx.EndBusyCursor() 4147 wx.CallAfter( UpdateDData)2891 wx.CallAfter(G2ddG.UpdateDData,G2frame,DData,data) 4148 2892 finally: 4149 2893 dlg.Destroy() … … 4198 2942 refList[generalData['Name']] = [] 4199 2943 data['Histograms'] = UseList 4200 wx.CallAfter( UpdateDData)2944 wx.CallAfter(G2ddG.UpdateDData,G2frame,DData,data) 4201 2945 finally: 4202 2946 dlg.Destroy() … … 4221 2965 for i in DelList: 4222 2966 del UseList[i] 4223 wx.CallAfter( UpdateDData)2967 wx.CallAfter(G2ddG.UpdateDData,G2frame,DData,data) 4224 2968 finally: 4225 2969 dlg.Destroy() … … 4230 2974 4231 2975 def FillRigidBodyGrid(): 2976 AtLookUp = G2mth.FillAtomLookUp(data['Atoms']) 2977 general = data['General'] 2978 Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7]) 2979 Indx = {} 2980 2981 def ResrbSizer(RBObj): 2982 2983 def OnOrigRef(event): 2984 RBObj['Orig'][1] = Ocheck.GetValue() 2985 2986 def OnOrienRef(event): 2987 RBObj['Orient'][1] = Qcheck.GetValue() 2988 2989 def OnTorsionRef(event): 2990 Obj = event.GetEventObject() 2991 item = Indx[Obj.GetId()] 2992 RBObj['Torsions'][item][1] = Obj.GetValue() 2993 2994 def OnTorsion(event): 2995 Obj = event.GetEventObject() 2996 item = Indx[Obj.GetId()] 2997 try: 2998 val = float(Obj.GetValue()) 2999 RBObj['Torsions'][item][0] = val 3000 RBData = G2frame.PatternTree.GetItemPyData( 3001 G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue'] 3002 G2mth.UpdateResRBAtoms(Amat,Bmat,data['Atoms'],AtLookUp,RBObj,RBData) 3003 except ValueError: 3004 pass 3005 Obj.SetValue("%10.3f"%(RBObj['Torsions'][item][0])) 3006 3007 resrbSizer = wx.BoxSizer(wx.VERTICAL) 3008 resrbSizer.Add(wx.StaticText(RigidBodies,-1,120*'-')) 3009 resrbSizer.Add(wx.StaticText(RigidBodies,-1, 3010 'Name: '+RBObj['ResName']+RBObj['numChain']),0,wx.ALIGN_CENTER_VERTICAL) 3011 topSizer = wx.FlexGridSizer(2,2,5,5) 3012 Orig = RBObj['Orig'][0] 3013 Orien = RBObj['Orient'][0] 3014 topSizer.Add(wx.StaticText(RigidBodies,-1, 3015 ' %s %8.5f %8.5f %8.5f'%( 'Origin :',Orig[0],Orig[1],Orig[2]))) 3016 Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?') 3017 Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef) 3018 Ocheck.SetValue(RBObj['Orig'][1]) 3019 topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL) 3020 topSizer.Add(wx.StaticText(RigidBodies,-1, 3021 ' %s %8.5f %8.5f %8.5f %8.5f '%('Orientation:',Orien[0],Orien[1],Orien[2],Orien[3]))) 3022 Qcheck = wx.CheckBox(RigidBodies,-1,'Refine?') 3023 Qcheck.Bind(wx.EVT_CHECKBOX,OnOrienRef) 3024 Qcheck.SetValue(RBObj['Orient'][1]) 3025 topSizer.Add(Qcheck,0,wx.ALIGN_CENTER_VERTICAL) 3026 resrbSizer.Add(topSizer) 3027 resrbSizer.Add(wx.StaticText(RigidBodies,-1,' Torsions:'),0,wx.ALIGN_CENTER_VERTICAL) 3028 torSizer = wx.FlexGridSizer(1,6,5,5) 3029 for itors,tors in enumerate(RBObj['Torsions']): 3030 torSizer.Add(wx.StaticText(RigidBodies,-1,'Torsion '+'%d'%(itors)),0,wx.ALIGN_CENTER_VERTICAL) 3031 torsTxt = wx.TextCtrl(RigidBodies,-1,value='%.3f'%(tors[0]),style=wx.TE_PROCESS_ENTER) 3032 torsTxt.Bind(wx.EVT_TEXT_ENTER,OnTorsion) 3033 torsTxt.Bind(wx.EVT_KILL_FOCUS,OnTorsion) 3034 Indx[torsTxt.GetId()] = itors 3035 torSizer.Add(torsTxt) 3036 torCheck = wx.CheckBox(RigidBodies,-1,'Refine?') 3037 torCheck.Bind(wx.EVT_CHECKBOX,OnTorsionRef) 3038 torCheck.SetValue(tors[1]) 3039 Indx[torCheck.GetId()] = itors 3040 torSizer.Add(torCheck,0,wx.ALIGN_CENTER_VERTICAL) 3041 resrbSizer.Add(torSizer) 3042 return resrbSizer 3043 4232 3044 G2frame.dataFrame.SetStatusText('') 4233 RigidBodies.DestroyChildren()4234 dataDisplay = wx.Panel(RigidBodies)4235 3045 mainSizer = wx.BoxSizer(wx.VERTICAL) 4236 mainSizer.Add((5,5),0) 4237 mainSizer.Add(wx.StaticText(dataDisplay,-1,' :'),0,wx.ALIGN_CENTER_VERTICAL) 4238 mainSizer.Add((5,5),0) 4239 # mainSizer.Add(SlopSizer(),0) 4240 # mainSizer.Add((5,5),0) 4241 # mainSizer.Add(ShowSizer(),0,) 4242 # mainSizer.Add((5,5),0) 4243 # mainSizer.Add(RadSizer(),0,) 4244 4245 dataDisplay.SetSizer(mainSizer) 4246 Size = mainSizer.Fit(G2frame.dataFrame) 4247 Size[1] += 35 #compensate for status bar 4248 dataDisplay.SetSize(Size) 3046 if 'Residue' in data['RBModels']: 3047 mainSizer.Add((5,5),0) 3048 mainSizer.Add(wx.StaticText(RigidBodies,-1,'Residue rigid bodies:'),0,wx.ALIGN_CENTER_VERTICAL) 3049 mainSizer.Add((5,5),0) 3050 for RBObj in data['RBModels']['Residue']: 3051 mainSizer.Add(ResrbSizer(RBObj)) 3052 3053 RigidBodies.SetSizer(mainSizer) 3054 mainSizer.FitInside(G2frame.dataFrame) 3055 Size = mainSizer.GetMinSize() 3056 Size[0] += 40 3057 Size[1] = max(Size[1],290) + 35 3058 RigidBodies.SetSize(Size) 3059 RigidBodies.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1) 3060 Size[1] = min(Size[1],450) 4249 3061 G2frame.dataFrame.setSizePosLeft(Size) 3062 3063 def OnAutoFindResRB(event): 3064 RBData = G2frame.PatternTree.GetItemPyData( 3065 G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue'] 3066 rbKeys = RBData.keys() 3067 rbKeys.remove('AtInfo') 3068 if not len(rbKeys): 3069 print '**** ERROR - no residue rigid bodies are defined ****' 3070 return 3071 RBNames = [RBData[k]['RBname'] for k in rbKeys] 3072 RBIds = dict(zip(RBNames,rbKeys)) 3073 general = data['General'] 3074 Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7]) 3075 Atoms = data['Atoms'] 3076 AtLookUp = G2mth.FillAtomLookUp(Atoms) 3077 if 'macro' not in general['Type']: 3078 print '**** ERROR - this phase is not a macromolecule ****' 3079 return 3080 if not len(Atoms): 3081 print '**** ERROR - this phase has no atoms ****' 3082 return 3083 RBObjs = [] 3084 cx,ct = general['AtomPtrs'][:2] 3085 iatm = 0 3086 wx.BeginBusyCursor() 3087 try: 3088 while iatm < len(Atoms): 3089 atom = Atoms[iatm] 3090 res = atom[1].strip() 3091 numChain = ' %s %s'%(atom[0],atom[2]) 3092 if res not in RBIds: 3093 iatm += 1 3094 continue #for water molecules, etc. 3095 rbRes = RBData[RBIds[res]] 3096 rbRef = rbRes['rbRef'] 3097 VAR = rbRes['rbXYZ'][rbRef[1]]-rbRes['rbXYZ'][rbRef[0]] 3098 VBR = rbRes['rbXYZ'][rbRef[2]]-rbRes['rbXYZ'][rbRef[0]] 3099 rbObj = {'ResName':rbRes['RBname'],'numChain':numChain} 3100 rbAtoms = [] 3101 rbIds = [] 3102 for iratm in range(len(rbRes['atNames'])): 3103 rbAtoms.append(np.array(Atoms[iatm][cx:cx+3])) 3104 rbIds.append(Atoms[iatm][20]) 3105 iatm += 1 #puts this at beginning of next residue? 3106 Orig = rbAtoms[rbRef[0]] 3107 rbObj['Ids'] = rbIds 3108 rbObj['Orig'] = [Orig,False] 3109 # print ' residue '+rbRes['RBname']+str(atom[0]).strip()+ \ 3110 # ' origin at: ','%.5f %.5f %.5f'%(Orig[0],Orig[1],Orig[2]) 3111 VAC = np.inner(Amat,rbAtoms[rbRef[1]]-Orig) 3112 VBC = np.inner(Amat,rbAtoms[rbRef[2]]-Orig) 3113 VCC = np.cross(VAR,VAC) 3114 QuatA = G2mth.makeQuat(VAR,VAC,VCC)[0] 3115 VAR = G2mth.prodQVQ(QuatA,VAR) 3116 VBR = G2mth.prodQVQ(QuatA,VBR) 3117 QuatB = G2mth.makeQuat(VBR,VBC,VAR)[0] 3118 QuatC = G2mth.prodQQ(QuatB,QuatA) 3119 rbObj['Orient'] = [QuatC,False] 3120 SXYZ = [] 3121 TXYZ = [] 3122 rbObj['Torsions'] = [] 3123 for i,xyz in enumerate(rbRes['rbXYZ']): 3124 SXYZ.append(G2mth.prodQVQ(QuatC,xyz)) 3125 TXYZ.append(np.inner(Amat,rbAtoms[i]-Orig)) 3126 for Oatm,Patm,x,Riders in rbRes['rbSeq']: 3127 VBR = SXYZ[Oatm]-SXYZ[Patm] 3128 VAR = SXYZ[Riders[0]]-SXYZ[Patm] 3129 VAC = TXYZ[Riders[0]]-TXYZ[Patm] 3130 QuatA,D = G2mth.makeQuat(VAR,VAC,VBR) 3131 ang = 180.*D/np.pi 3132 rbObj['Torsions'].append([ang,False]) 3133 for ride in Riders: 3134 SXYZ[ride] = G2mth.prodQVQ(QuatA,SXYZ[ride]-SXYZ[Patm])+SXYZ[Patm] 3135 RBObjs.append(rbObj) 3136 data['RBModels']['Residue'] = RBObjs 3137 for RBObj in RBObjs: 3138 G2mth.UpdateResRBAtoms(Amat,Bmat,Atoms,AtLookUp,RBObj,RBData) 3139 finally: 3140 wx.EndBusyCursor() 3141 FillRigidBodyGrid() 4250 3142 3143 def OnGlobalResRBRef(event): 3144 RBObjs = data['RBModels']['Residue'] 3145 names = ['Origin','Orientation',] 3146 nTor = 0 3147 for rbObj in RBObjs: 3148 nTor = max(nTor,len(rbObj['Torsions'])) 3149 names += ['Torsion '+str(i) for i in range(nTor)] 3150 dlg = wx.MultiChoiceDialog(G2frame,'Select','Refinement controls',names) 3151 if dlg.ShowModal() == wx.ID_OK: 3152 sel = dlg.GetSelections() 3153 parms = [] 3154 for x in sel: 3155 parms.append(names[x]) 3156 wx.BeginBusyCursor() 3157 try: 3158 for rbObj in RBObjs: 3159 if 'Origin' in parms: 3160 rbObj['Orig'][1] = True 3161 else: 3162 rbObj['Orig'][1] = False 3163 if 'Orientation' in parms: 3164 rbObj['Orient'][1] = True 3165 else: 3166 rbObj['Orient'][1] = False 3167 for i in range(len(rbObj['Torsions'])): 3168 if 'Torsion '+str(i) in parms: 3169 rbObj['Torsions'][i][1] = True 3170 else: 3171 rbObj['Torsions'][i][1] = False 3172 finally: 3173 wx.EndBusyCursor() 3174 FillRigidBodyGrid() 3175 4251 3176 4252 3177 ################################################################################ … … 4721 3646 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomAdd, id=G2gd.wxID_ATOMSEDITADD) 4722 3647 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewAdd, id=G2gd.wxID_ATOMSVIEWADD) 3648 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAppend, id=G2gd.wxID_RBAPPEND) 4723 3649 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomInsert, id=G2gd.wxID_ATOMSEDITINSERT) 4724 3650 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewInsert, id=G2gd.wxID_ATOMVIEWINSERT) 3651 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB) 4725 3652 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomMove, id=G2gd.wxID_ATOMMOVE) 4726 3653 G2frame.dataFrame.Bind(wx.EVT_MENU, AtomDelete, id=G2gd.wxID_ATOMSEDITDELETE) … … 4730 3657 G2frame.dataFrame.Bind(wx.EVT_MENU, OnReloadDrawAtoms, id=G2gd.wxID_RELOADDRAWATOMS) 4731 3658 G2frame.dataFrame.Bind(wx.EVT_MENU, OnDistAngle, id=G2gd.wxID_ATOMSDISAGL) 4732 FillAtomsGrid( )3659 FillAtomsGrid(Atoms) 4733 3660 elif text == 'General': 4734 3661 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.DataGeneral) … … 4743 3670 G2frame.dataFrame.Bind(wx.EVT_MENU, OnHklfAdd, id=G2gd.wxID_HKLFADD) 4744 3671 G2frame.dataFrame.Bind(wx.EVT_MENU, OnDataDelete, id=G2gd.wxID_DATADELETE) 4745 UpdateDData()3672 G2ddG.UpdateDData(G2frame,DData,data) 4746 3673 G2plt.PlotSizeStrainPO(G2frame,data,Start=True) 4747 3674 elif text == 'Draw Options': … … 4771 3698 UpdateDrawAtoms() 4772 3699 G2plt.PlotStructure(G2frame,data) 4773 elif text == 'R igid bodies':4774 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.RigidBod yMenu)4775 4776 3700 elif text == 'RB Models': 3701 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.RigidBodiesMenu) 3702 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB) 3703 G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE) 4777 3704 FillRigidBodyGrid() 4778 3705 elif text == 'Pawley reflections': … … 4827 3754 G2frame.dataDisplay.AddPage(drawAtoms,'Draw Atoms') 4828 3755 RigidBodies = wx.ScrolledWindow(G2frame.dataDisplay) 4829 G2frame.dataDisplay.AddPage(RigidBodies,'R igid bodies')3756 G2frame.dataDisplay.AddPage(RigidBodies,'RB Models') 4830 3757 MapPeaks = G2gd.GSGrid(G2frame.dataDisplay) 4831 3758 G2frame.dataDisplay.AddPage(MapPeaks,'Map peaks') … … 4837 3764 G2frame.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged) 4838 3765 G2frame.dataDisplay.SetSelection(oldPage) 3766 -
trunk/GSASIIrestrGUI.py
r825 r848 18 18 import GSASIImath as G2mth 19 19 import GSASIIlattice as G2lat 20 import GSASIIphsGUI as G2phG21 20 import GSASIIspc as G2spc 22 21 import GSASIIgrid as G2gd … … 321 320 if len(Lists['B-atom']): 322 321 value = 109.54 323 dlg = G2 phG.SingleFloatDialog(G2frame,'Angle','Enter restraint angle ',value,[30.,180.],'%.2f')322 dlg = G2gd.SingleFloatDialog(G2frame,'Angle','Enter restraint angle ',value,[30.,180.],'%.2f') 324 323 if dlg.ShowModal() == wx.ID_OK: 325 324 value = dlg.GetValue() … … 703 702 if len(ids) > 2: 704 703 value = 1.0 705 dlg = G2 phG.SingleFloatDialog(G2frame,'Angle','Enter unit cell sum ',value,[-1.e6,1.e6],'%.2f')704 dlg = G2gd.SingleFloatDialog(G2frame,'Angle','Enter unit cell sum ',value,[-1.e6,1.e6],'%.2f') 706 705 if dlg.ShowModal() == wx.ID_OK: 707 706 value = dlg.GetValue() … … 817 816 Bonds.ClearSelection() 818 817 val = bondList[rows[0]][2] 819 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new value for bond',val,[0.,5.],'%.4f')818 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new value for bond',val,[0.,5.],'%.4f') 820 819 if dlg.ShowModal() == wx.ID_OK: 821 820 parm = dlg.GetValue() … … 831 830 Bonds.ClearSelection() 832 831 val = bondList[rows[0]][3] 833 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for bond',val,[0.,1.],'%.4f')832 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for bond',val,[0.,1.],'%.4f') 834 833 if dlg.ShowModal() == wx.ID_OK: 835 834 parm = dlg.GetValue() … … 941 940 Angles.ClearSelection() 942 941 val = angleList[rows[0]][2] 943 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new value for angle',val,[0.,360.],'%.2f')942 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new value for angle',val,[0.,360.],'%.2f') 944 943 if dlg.ShowModal() == wx.ID_OK: 945 944 parm = dlg.GetValue() … … 955 954 Angles.ClearSelection() 956 955 val = angleList[rows[0]][3] 957 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for angle',val,[0.,5.],'%.2f')956 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for angle',val,[0.,5.],'%.2f') 958 957 if dlg.ShowModal() == wx.ID_OK: 959 958 parm = dlg.GetValue() … … 1069 1068 Planes.ClearSelection() 1070 1069 val = planeList[rows[0]][3] 1071 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for plane',val,[0.,5.],'%.2f')1070 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for plane',val,[0.,5.],'%.2f') 1072 1071 if dlg.ShowModal() == wx.ID_OK: 1073 1072 parm = dlg.GetValue() … … 1194 1193 Volumes.ClearSelection() 1195 1194 val = volumeList[rows[0]][2] 1196 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new value for chiral volume',val,[0.,360.],'%.2f')1195 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new value for chiral volume',val,[0.,360.],'%.2f') 1197 1196 if dlg.ShowModal() == wx.ID_OK: 1198 1197 parm = dlg.GetValue() … … 1208 1207 Volumes.ClearSelection() 1209 1208 val = volumeList[rows[0]][3] 1210 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for chiral volume',val,[0.,5.],'%.2f')1209 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for chiral volume',val,[0.,5.],'%.2f') 1211 1210 if dlg.ShowModal() == wx.ID_OK: 1212 1211 parm = dlg.GetValue() … … 1317 1316 Torsions.ClearSelection() 1318 1317 val = torsionList[rows[0]][4] 1319 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for torsion restraints',val,[0.,5.],'%.2f')1318 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for torsion restraints',val,[0.,5.],'%.2f') 1320 1319 if dlg.ShowModal() == wx.ID_OK: 1321 1320 parm = dlg.GetValue() … … 1432 1431 Ramas.ClearSelection() 1433 1432 val = ramaList[rows[0]][4] 1434 dlg = G2 phG.SingleFloatDialog(G2frame,'New value','Enter new esd for energy',val,[0.,5.],'%.2f')1433 dlg = G2gd.SingleFloatDialog(G2frame,'New value','Enter new esd for energy',val,[0.,5.],'%.2f') 1435 1434 if dlg.ShowModal() == wx.ID_OK: 1436 1435 parm = dlg.GetValue() … … 1558 1557 return 1559 1558 ChemComps.ClearSelection() 1560 dlg = G2 phG.SingleFloatDialog(G2frame,'New value',1559 dlg = G2gd.SingleFloatDialog(G2frame,'New value', 1561 1560 'Enter new value for restraint multiplier',1.0,[-1.e6,1.e6],'%.2f') 1562 1561 if dlg.ShowModal() == wx.ID_OK: -
trunk/GSASIIstruct.py
r847 r848 3900 3900 ncyc = int(result[2]['nfev']/len(varyList)) 3901 3901 3902 3903 3904 3902 runtime = time.time()-begin 3905 3903 Rvals['chisq'] = np.sum(result[2]['fvec']**2)
Note: See TracChangeset
for help on using the changeset viewer.