Changeset 5352
- Timestamp:
- Oct 20, 2022 9:56:41 PM (5 months ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIctrlGUI.py
r5341 r5352 6023 6023 return BlockSelector(ChoiceList,ParentFrame,title, 6024 6024 size,header) 6025 6026 def XformMatrix(panel,Trans,Uvec,Vvec,OnLeave=None,OnLeaveArgs={}): 6027 '''Display a transformation matrix and two vectors''' 6028 Trmat = wx.FlexGridSizer(4,6,0,0) 6029 Trmat.Add((10,0),0) 6030 Trmat.Add(wx.StaticText(panel,label=' M'),wx.ALIGN_CENTER) 6031 Trmat.Add((10,0),0) 6032 Trmat.Add((10,0),0) 6033 Trmat.Add(wx.StaticText(panel,label=' U'),wx.ALIGN_CENTER) 6034 Trmat.Add(wx.StaticText(panel,label=' V'),wx.ALIGN_CENTER) 6035 6036 for iy,line in enumerate(Trans): 6037 for ix,val in enumerate(line): 6038 item = ValidatedTxtCtrl(panel,Trans[iy],ix,nDig=(10,3),size=(65,25), 6039 OnLeave=OnLeave,OnLeaveArgs=OnLeaveArgs) 6040 Trmat.Add(item) 6041 Trmat.Add((25,0),0) 6042 vec = ValidatedTxtCtrl(panel,Uvec,iy,nDig=(10,3),size=(65,25), 6043 OnLeave=OnLeave,OnLeaveArgs=OnLeaveArgs) 6044 Trmat.Add(vec) 6045 vec = ValidatedTxtCtrl(panel,Vvec,iy,nDig=(10,3),size=(65,25), 6046 OnLeave=OnLeave,OnLeaveArgs=OnLeaveArgs) 6047 Trmat.Add(vec) 6048 return Trmat 6049 6050 def showUniqueCell(frame,cellSizer,row,cell,SGData=None, 6051 editAllowed=False,OnCellChange=None): 6052 '''function to put cell values into a GridBagSizer. 6053 First column (#0) is reserved for labels etc. 6054 if editAllowed is True, values are placed in a wx.TextCtrl and if needed 6055 two rows are used in the table. 6056 ''' 6057 cellGUIlist = [ 6058 [['m3','m3m'],[" Unit cell: a = "],["{:.5f}"],[0]], 6059 [['3R','3mR'],[" a = ",u" \u03B1 = "],["{:.5f}","{:.3f}"],[0,3]], 6060 [['3','3m1','31m','6/m','6/mmm','4/m','4/mmm'],[" a = "," c = "], 6061 ["{:.5f}","{:.5f}"],[0,2]], 6062 [['mmm'],[" a = "," b = "," c = "],["{:.5f}","{:.5f}","{:.5f}"], 6063 [0,1,2]], 6064 [['2/m'+'a'],[" a = "," b = "," c = ",u" \u03B1 = "], 6065 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[0,1,2,3]], 6066 [['2/m'+'b'],[" a = "," b = "," c = ",u" \u03B2 = "], 6067 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[0,1,2,4]], 6068 [['2/m'+'c'],[" a = "," b = "," c = ",u" \u03B3 = "], 6069 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[0,1,2,5]], 6070 [['-1'],[" a = "," b = "," c = ",u" \u03B1 = ",u" \u03B2 = ",u" \u03B3 = "], 6071 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}","{:.3f}","{:.3f}"],[0,1,2,3,4,5]] 6072 ] 6073 VERY_LIGHT_GREY = wx.Colour(235,235,235) 6074 cellList = [] 6075 if SGData is None: 6076 laue = '-1' 6077 else: 6078 laue = SGData['SGLaue'] 6079 if laue == '2/m': laue += SGData['SGUniq'] 6080 for cellGUI in cellGUIlist: 6081 if laue in cellGUI[0]: 6082 useGUI = cellGUI 6083 break 6084 for txt,fmt,indx in zip(*useGUI[1:]): 6085 col = 1+2*indx 6086 cellrow = row 6087 if editAllowed and indx > 2: 6088 cellrow = row + 1 6089 col = 1+2*(indx-3) 6090 cellSizer.Add(wx.StaticText(frame,label=txt),(cellrow,col)) 6091 if editAllowed: 6092 Fmt = (10,5) 6093 if '.3' in fmt: Fmt = (10,3) 6094 cellVal = ValidatedTxtCtrl(frame,cell,indx, 6095 xmin=0.1,xmax=500.,nDig=Fmt,OnLeave=OnCellChange) 6096 cellSizer.Add(cellVal,(cellrow,col+1)) 6097 cellList.append(cellVal.GetId()) 6098 else: 6099 cellSizer.Add(wx.StaticText(frame,label=fmt.format(cell[indx])),(cellrow,col+1)) 6100 #volume 6101 volCol = 13 6102 if editAllowed: 6103 volCol = 8 6104 cellSizer.Add(wx.StaticText(frame,label=' Vol = '),(row,volCol)) 6105 if editAllowed: 6106 volVal = wx.TextCtrl(frame,value=('{:.2f}'.format(cell[6])),style=wx.TE_READONLY) 6107 volVal.SetBackgroundColour(VERY_LIGHT_GREY) 6108 cellSizer.Add(volVal,(row,volCol+1)) 6109 else: 6110 cellSizer.Add(wx.StaticText(frame,label='{:.2f}'.format(cell[6])),(row,volCol+1)) 6111 return cellrow,cellList 6112 6025 6113 6026 6114 ################################################################################ -
trunk/GSASIIphsGUI.py
r5343 r5352 487 487 commonSizer.Add(common,0,WACV) 488 488 transSizer.Add(commonSizer) 489 Trmat = wx.FlexGridSizer(4,6,0,0) 490 Trmat.Add((10,0),0) 491 Trmat.Add(wx.StaticText(self.panel,label=' M'),wx.ALIGN_CENTER) 492 Trmat.Add((10,0),0) 493 Trmat.Add((10,0),0) 494 Trmat.Add(wx.StaticText(self.panel,label=' U'),wx.ALIGN_CENTER) 495 Trmat.Add(wx.StaticText(self.panel,label=' V'),wx.ALIGN_CENTER) 496 497 for iy,line in enumerate(self.Trans): 498 for ix,val in enumerate(line): 499 item = G2G.ValidatedTxtCtrl(self.panel,self.Trans[iy],ix,nDig=(10,3),size=(65,25)) 500 Trmat.Add(item) 501 Trmat.Add((25,0),0) 502 vec = G2G.ValidatedTxtCtrl(self.panel,self.Uvec,iy,nDig=(10,3),size=(65,25)) 503 Trmat.Add(vec) 504 vec = G2G.ValidatedTxtCtrl(self.panel,self.Vvec,iy,nDig=(10,3),size=(65,25)) 505 Trmat.Add(vec) 506 transSizer.Add(Trmat) 489 transSizer.Add(G2G.XformMatrix(self.panel,self.Trans,self.Uvec,self.Vvec)) 507 490 MatSizer.Add((10,0),0) 508 491 MatSizer.Add(transSizer) … … 3044 3027 3045 3028 def OnUseBilbao(event): 3029 '''Select and apply a transformation matrix from the Bilbao web site 3030 to create a new phase 3031 ''' 3046 3032 PatternName = data['magPhases'] 3047 3033 PatternId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,PatternName) … … 3096 3082 SGData = generalData['SGData'] 3097 3083 vvec = np.array([0.,0.,0.]) 3084 newPhase['MagXform'] = (magchoice['Trans'],magchoice['Uvec'],vvec) 3098 3085 newPhase,atCodes = G2lat.TransformPhase(data,newPhase,magchoice['Trans'],magchoice['Uvec'],vvec,ifMag) 3099 3086 Atoms = newPhase['Atoms'] -
trunk/GSASIIpy3.py
r4534 r5352 19 19 20 20 # formatting for unique cell parameters by Laue type 21 cellGUIlist = [[['m3','m3m'],4,[" Unit cell: a = "],["{:.5f}"],[True],[0]], 22 [['3R','3mR'],6,[" a = ",u" \u03B1 = "],["{:.5f}","{:.3f}"],[True,True],[0,3]], 23 [['3','3m1','31m','6/m','6/mmm','4/m','4/mmm'],6,[" a = "," c = "],["{:.5f}","{:.5f}"],[True,True],[0,2]], 24 [['mmm'],8,[" a = "," b = "," c = "],["{:.5f}","{:.5f}","{:.5f}"], 25 [True,True,True],[0,1,2]], 26 [['2/m'+'a'],10,[" a = "," b = "," c = ",u" \u03B1 = "], 27 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,3]], 28 [['2/m'+'b'],10,[" a = "," b = "," c = ",u" \u03B2 = "], 29 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,4]], 30 [['2/m'+'c'],10,[" a = "," b = "," c = ",u" \u03B3 = "], 31 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,5]], 32 [['-1'],7,[" a = "," b = "," c = ",u" \u03B1 = ",u" \u03B2 = ",u" \u03B3 = "], 33 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}","{:.3f}","{:.3f}"], 34 [True,True,True,False,True,True,True],[0,1,2,3,4,5]]] 21 cellGUIlist = [ 22 [['m3','m3m'],4,[" Unit cell: a = "],["{:.5f}"],[True],[0]], 23 [['3R','3mR'],6,[" a = ",u" \u03B1 = "],["{:.5f}","{:.3f}"],[True,True],[0,3]], 24 [['3','3m1','31m','6/m','6/mmm','4/m','4/mmm'],6,[" a = "," c = "],["{:.5f}","{:.5f}"],[True,True],[0,2]], 25 [['mmm'],8,[" a = "," b = "," c = "],["{:.5f}","{:.5f}","{:.5f}"], 26 [True,True,True],[0,1,2]], 27 [['2/m'+'a'],10,[" a = "," b = "," c = ",u" \u03B1 = "], 28 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,3]], 29 [['2/m'+'b'],10,[" a = "," b = "," c = ",u" \u03B2 = "], 30 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,4]], 31 [['2/m'+'c'],10,[" a = "," b = "," c = ",u" \u03B3 = "], 32 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}"],[True,True,True,True,],[0,1,2,5]], 33 [['-1'],7,[" a = "," b = "," c = ",u" \u03B1 = ",u" \u03B2 = ",u" \u03B3 = "], 34 ["{:.5f}","{:.5f}","{:.5f}","{:.3f}","{:.3f}","{:.3f}"], 35 [True,True,True,True,True,True],[0,1,2,3,4,5]] 36 ] 35 37 36 38 def FormulaEval(string): -
trunk/exports/G2export_CIF.py
r5232 r5352 32 32 import copy 33 33 import re 34 interactive = False 34 35 try: 35 36 import wx 36 37 import wx.lib.scrolledpanel as wxscroll 37 38 import wx.lib.resizewidget as rw 39 interactive = True 38 40 except ImportError: 39 41 # Avoid wx dependency for CLI … … 59 61 import GSASIIstrMain as G2stMn 60 62 import GSASIIstrIO as G2stIO 61 import GSASIImapvars as G2mv63 #import GSASIImapvars as G2mv 62 64 import GSASIIElem as G2el 63 65 import GSASIIpy3 as G2py3 … … 3220 3222 WriteCIFitem(self.fp, '\n# STRUCTURE FACTOR TABLE') 3221 3223 # compute maximum intensity reflection 3222 Imax = 03224 #Imax = 0 3223 3225 phaselist = [] 3224 3226 for phasenam in histblk['Reflection Lists']: 3225 try:3226 scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]3227 except KeyError: # reflection table from removed phase?3228 continue3227 #try: 3228 # scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0] 3229 #except KeyError: # reflection table from removed phase? 3230 # continue 3229 3231 phaselist.append(phasenam) 3230 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])3231 I100 = scale*refList.T[8]*refList.T[11]3232 #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList']) 3233 #I100 = scale*refList.T[8]*refList.T[11] 3232 3234 #Icorr = np.array([refl[13] for refl in histblk['Reflection Lists'][phasenam]])[0] 3233 3235 #FO2 = np.array([refl[8] for refl in histblk['Reflection Lists'][phasenam]]) … … 3261 3263 dmin = None 3262 3264 for phasenam in phaselist: 3263 scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]3265 #scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0] 3264 3266 phaseid = self.Phases[phasenam]['pId'] 3265 3267 refcount += len(histblk['Reflection Lists'][phasenam]['RefList']) 3266 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])3267 I100 = scale*refList.T[8]*refList.T[11]3268 #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList']) 3269 #I100 = scale*refList.T[8]*refList.T[11] 3268 3270 for j,ref in enumerate(histblk['Reflection Lists'][phasenam]['RefList']): 3269 3271 if DEBUG: … … 4577 4579 self.author = '' 4578 4580 4581 def mergeMag(self,G2frame,ChemPhase,MagPhase): 4582 if not interactive: return # if wx is not loaded then merge is not an option 4583 dlg = wx.MessageDialog(self.G2frame,'Do you want to merge chemical and magentic phases?', 4584 'Confirm phase merge',wx.YES|wx.NO) 4585 try: 4586 dlg.CenterOnParent() 4587 result = dlg.ShowModal() 4588 finally: 4589 dlg.Destroy() 4590 if result != wx.ID_YES: return 4591 dlg = wx.Dialog(G2frame,wx.ID_ANY,'Merge criteria', 4592 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) 4593 dlg.CenterOnParent() 4594 import imp 4595 imp.reload(G2G) 4596 def onChange(*args,**kwargs): 4597 #wx.CallAfter(showMergeMag) 4598 wx.CallLater(100,showMergeMag) 4599 def showMergeMag(): 4600 if dlg.GetSizer(): 4601 mainSizer = dlg.GetSizer() 4602 mainSizer.Clear(True) 4603 else: 4604 mainSizer = wx.BoxSizer(wx.VERTICAL) 4605 dlg.SetSizer(mainSizer) 4606 mainSizer.Add(wx.StaticText(dlg,label=' Define transformation'), 4607 0,wx.ALIGN_CENTER) 4608 mainSizer.Add(G2G.XformMatrix(dlg,Trans,Uvec,Vvec,OnLeave=onChange)) 4609 newCell = G2lat.TransformCell(self.Phases[ChemPhase]['General']['Cell'][1:7],Trans) 4610 cellSizer = wx.GridBagSizer() 4611 G2G.showUniqueCell(dlg,cellSizer,0, 4612 self.Phases[ChemPhase]['General']['Cell'][1:], 4613 self.Phases[ChemPhase]['General']['SGData']) 4614 cellSizer.Add(wx.StaticText(dlg,label=' Chem cell '),(0,0)) 4615 G2G.showUniqueCell(dlg,cellSizer,1, 4616 self.Phases[MagPhase]['General']['Cell'][1:], 4617 self.Phases[MagPhase]['General']['SGData']) 4618 cellSizer.Add(wx.StaticText(dlg,label=' Mag cell '),(1,0)) 4619 G2G.showUniqueCell(dlg,cellSizer,2,newCell) 4620 cellSizer.Add(wx.StaticText(dlg,label=' Xform cell '),(2,0)) 4621 mainSizer.Add(cellSizer) 4622 cellsSame = True 4623 diff = 0.01 4624 for i in range(6): 4625 if i == 3: diff = 0.1 4626 if abs(self.Phases[MagPhase]['General']['Cell'][i+1]-newCell[i]) > diff: 4627 cellsSame = False 4628 break 4629 4630 if cellsSame: 4631 tmpPhase['Atoms'] = copy.deepcopy(self.Phases[ChemPhase]['Atoms']) 4632 _,atCodes = G2lat.TransformPhase(self.Phases[ChemPhase], 4633 tmpPhase,Trans,Uvec,Vvec,False) # xforms atoms not cell 4634 mainSizer.Add((0,15)) 4635 atomSizer = wx.BoxSizer(wx.HORIZONTAL) 4636 4637 atomSubSizer = wx.BoxSizer(wx.VERTICAL) 4638 atomSubSizer.Add(wx.StaticText(dlg,label='Magnetic phase contents')) 4639 G2G.HorizontalLine(atomSubSizer,dlg) 4640 atompnl = wxscroll.ScrolledPanel(dlg,size=(250,250)) 4641 atomBox = wx.FlexGridSizer(0, 4, 2, 2) # rows, cols, vgap, hgap 4642 for atom in self.Phases[MagPhase]['Atoms']: 4643 atomBox.Add(wx.StaticText(atompnl,label=atom[ctM-1])) 4644 for x in atom[cxM:cxM+3]: 4645 atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x))) 4646 atompnl.SetSizer(atomBox) 4647 atompnl.SetAutoLayout(1) 4648 atompnl.SetupScrolling() 4649 atompnl.Layout() 4650 atomSubSizer.Add(atompnl) 4651 atomSizer.Add(atomSubSizer) 4652 4653 cellsSame = False # at least one atom must match 4654 atomSubSizer = wx.BoxSizer(wx.VERTICAL) 4655 atomSubSizer.Add(wx.StaticText(dlg,label='Chemical phase transformed')) 4656 G2G.HorizontalLine(atomSubSizer,dlg) 4657 atompnl = wxscroll.ScrolledPanel(dlg,size=(310,250)) 4658 atomBox = wx.FlexGridSizer(0, 5, 2, 2) # rows, cols, vgap, hgap 4659 for atom in tmpPhase['Atoms']: 4660 atomBox.Add(wx.StaticText(atompnl,label=atom[ctT-1])) 4661 for x in atom[cxT:cxT+3]: 4662 atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x))) 4663 match = False 4664 for Matom in self.Phases[MagPhase]['Atoms']: 4665 if atom[ctT] == Matom[ctM]: 4666 for i in range(3): 4667 if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005: 4668 break 4669 else: 4670 cellsSame = True 4671 match = Matom[ctM-1] 4672 break 4673 if match: 4674 atomBox.Add(wx.StaticText(atompnl,label=' matches '+match)) 4675 else: 4676 atomBox.Add((-1,-1)) 4677 atompnl.SetSizer(atomBox) 4678 atompnl.SetAutoLayout(1) 4679 atompnl.SetupScrolling() 4680 atompnl.Layout() 4681 atomSubSizer.Add(atompnl) 4682 atomSizer.Add(atomSubSizer) 4683 mainSizer.Add(atomSizer) 4684 mainSizer.Add((0,15)) 4685 OkBtn = wx.Button(dlg,wx.ID_ANY,"Merge phases") 4686 OkBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_OK)) 4687 OkBtn.Enable(cellsSame) 4688 cancelBtn = wx.Button(dlg,wx.ID_ANY,"Cancel") 4689 cancelBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_CANCEL)) 4690 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 4691 btnSizer.Add((20,20),1) 4692 btnSizer.Add(OkBtn) 4693 btnSizer.Add((20,20),1) 4694 btnSizer.Add(cancelBtn) 4695 btnSizer.Add((20,20),1) 4696 4697 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 4698 dlg.Fit() 4699 wx.CallAfter(dlg.SendSizeEvent) 4700 4701 Trans = np.eye(3) 4702 Uvec = np.zeros(3) 4703 Vvec = np.zeros(3) 4704 if 'MagXform' in self.Phases[MagPhase]: 4705 Trans,Uvec,Vvec = self.Phases[MagPhase]['MagXform'] 4706 tmpPhase = copy.deepcopy(self.Phases[MagPhase]) 4707 cxM,ctM,csM,ciaM = self.Phases[MagPhase]['General']['AtomPtrs'] 4708 cxT,ctT,csT,ciaT = self.Phases[ChemPhase]['General']['AtomPtrs'] 4709 4710 showMergeMag() 4711 4712 if dlg.ShowModal() != wx.ID_OK: 4713 dlg.Destroy() 4714 return None 4715 dlg.Destroy() 4716 # restore atom type info from chemical phase but keep the mag cell & sym, etc. 4717 combinedPhase = copy.deepcopy(self.Phases[MagPhase]) 4718 combinedPhase['General'] = copy.deepcopy(self.Phases[ChemPhase]['General']) 4719 combinedPhase['General']['Name'] += ' - merged' 4720 for k in 'SGData','Cell','AtomPtrs','Lande g','MagDmin','Type': 4721 if k not in self.Phases[MagPhase]['General']: continue 4722 combinedPhase['General'][k] = copy.deepcopy(self.Phases[MagPhase]['General'][k]) 4723 4724 for atom in tmpPhase['Atoms']: 4725 for x in atom[cxT:cxT+3]: 4726 match = False 4727 for Matom in self.Phases[MagPhase]['Atoms']: 4728 if atom[ctT] == Matom[ctM]: 4729 for i in range(3): 4730 if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005: 4731 break 4732 else: 4733 match = True 4734 break 4735 if not match: # add atom to merged phase 4736 combinedPhase['Atoms'].append(atom[:cxT+4]+[0.,0.,0.]+atom[cxT+4:]) 4737 return combinedPhase 4738 4579 4739 def Exporter(self,event=None): 4580 4740 # get a phase and file name … … 4588 4748 self.currentExportType = 'phase' 4589 4749 if self.ExportSelect('ask'): return 4590 self.OpenFile() 4750 self.OpenFile(delayOpen=True) 4751 MagPhase = None 4752 ChemPhase = None 4753 4754 if len(self.phasenam) == 2: 4755 for name in self.phasenam: 4756 if self.Phases[name]['General']['Type'] == 'nuclear': 4757 ChemPhase = name 4758 if self.Phases[name]['General']['Type'] == 'magnetic': 4759 MagPhase = name 4760 if MagPhase and ChemPhase: 4761 newPhase = self.mergeMag(self.G2frame,ChemPhase,MagPhase) 4762 if newPhase is not None: 4763 self.openDelayed() 4764 newName = ChemPhase + '_merged' 4765 self.Phases = {newName:newPhase} 4766 self._Exporter(event=event,phaseOnly=newName) 4767 self.CloseFile() 4768 return 4591 4769 for name in self.phasenam: 4592 self._Exporter(event=event,phaseOnly=name) #TODO: repeat for magnetic phase 4770 self.openDelayed() 4771 self._Exporter(event=event,phaseOnly=name) 4593 4772 self.CloseFile() 4594 4773
Note: See TracChangeset
for help on using the changeset viewer.