Changeset 3056
- Timestamp:
- Sep 8, 2017 2:17:29 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/GSASIIconstrGUI.py ¶
r3054 r3056 37 37 import GSASIIspc as G2spc 38 38 VERY_LIGHT_GREY = wx.Colour(235,235,235) 39 40 class MultiIntegerDialog(wx.Dialog):41 '''Input a series of integers based on prompts42 '''43 def __init__(self,parent,title,prompts,values):44 wx.Dialog.__init__(self,parent,-1,title,45 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)46 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw!47 self.values = values48 self.prompts = prompts49 self.Draw()50 51 def Draw(self):52 53 def OnValItem(event):54 event.Skip()55 Obj = event.GetEventObject()56 ind = Indx[Obj.GetId()]57 try:58 val = int(Obj.GetValue())59 if val <= 0:60 raise ValueError61 except ValueError:62 val = self.values[ind]63 self.values[ind] = val64 Obj.SetValue('%d'%(val))65 66 self.panel.Destroy()67 self.panel = wx.Panel(self)68 mainSizer = wx.BoxSizer(wx.VERTICAL)69 Indx = {}70 for ival,[prompt,value] in enumerate(zip(self.prompts,self.values)):71 mainSizer.Add(wx.StaticText(self.panel,-1,prompt),0,wx.ALIGN_CENTER)72 valItem = wx.TextCtrl(self.panel,-1,value='%d'%(value),style=wx.TE_PROCESS_ENTER)73 mainSizer.Add(valItem,0,wx.ALIGN_CENTER)74 Indx[valItem.GetId()] = ival75 valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem)76 valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem)77 OkBtn = wx.Button(self.panel,-1,"Ok")78 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)79 CancelBtn = wx.Button(self.panel,-1,'Cancel')80 CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)81 btnSizer = wx.BoxSizer(wx.HORIZONTAL)82 btnSizer.Add((20,20),1)83 btnSizer.Add(OkBtn)84 btnSizer.Add(CancelBtn)85 btnSizer.Add((20,20),1)86 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)87 self.panel.SetSizer(mainSizer)88 self.panel.Fit()89 self.Fit()90 91 def GetValues(self):92 return self.values93 94 def OnOk(self,event):95 parent = self.GetParent()96 parent.Raise()97 self.EndModal(wx.ID_OK)98 99 def OnCancel(self,event):100 parent = self.GetParent()101 parent.Raise()102 self.EndModal(wx.ID_CANCEL)103 39 104 40 class ConstraintDialog(wx.Dialog): … … 234 170 AtomDict = dict([Phases[phase]['pId'],Phases[phase]['Atoms']] for phase in Phases) 235 171 except KeyError: 236 G2frame.ErrorDialog('Constraint Error',' You must run least squares at least once before setting constraints\n'+ \237 'We suggest you refine scale factor first')172 G2frame.ErrorDialog('Constraint Error','Constraints cannot be set until a cycle of least squares'+ 173 'has been run.\nWe suggest you refine a scale factor.') 238 174 return 239 175 … … 871 807 872 808 :param str name: the type of constraints to be displayed ('HAP', 873 'Hist', 'Phase', or 'Global')809 'Hist', 'Phase', 'Global', 'Sym-Generated') 874 810 :param wx.Panel pageDisplay: parent panel for sizer 875 811 :returns: wx.Sizer created by method 876 812 ''' 877 #TODO: show symmetry generated constraints - no clue how to do this. 813 if name == 'Sym-Generated': #show symmetry generated constraints 814 Sizer1 = wx.BoxSizer(wx.VERTICAL) 815 Sizer1.Add(wx.StaticText(pageDisplay,wx.ID_ANY, 816 'Equivalences generated based on cell/space group input')) 817 Sizer1.Add((-1,5)) 818 Sizer = wx.FlexGridSizer(0,2,0,0) 819 Sizer1.Add(Sizer) 820 for sym in G2mv.GetSymEquiv(): 821 Sizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,'EQUIV'), 822 0,wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER|wx.RIGHT|wx.LEFT,3) 823 Sizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,sym)) 824 Sizer.Add((-1,-1)) 825 Sizer.Add((-1,2)) 826 return Sizer1 878 827 constSizer = wx.FlexGridSizer(0,6,0,0) 879 maxlen = 70 # characters before wrapping a constraint828 maxlen = 50 # characters before wrapping a constraint 880 829 for Id,item in enumerate(data[name]): 881 830 refineflag = False 882 831 helptext = "" 883 832 eqString = ['',] 833 problemItem = False 834 for term in item[:-3]: 835 if str(term[1]) in G2mv.problemVars: 836 problemItem = True 884 837 if item[-1] == 'h': # Hold on variable 885 838 constSizer.Add((-1,-1),0) # blank space for edit button … … 890 843 helptext = "Prevents variable:\n"+ var + " ("+ varMean + ")\nfrom being changed" 891 844 elif isinstance(item[-1],str): # not true on original-style (2011?) constraints 892 constEdit = wx.Button(pageDisplay, -1,'Edit',style=wx.BU_EXACTFIT)845 constEdit = wx.Button(pageDisplay,wx.ID_ANY,'Edit',style=wx.BU_EXACTFIT) 893 846 constEdit.Bind(wx.EVT_BUTTON,OnConstEdit) 894 847 constSizer.Add(constEdit,0,wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER,1) # edit button … … 966 919 data[name] = [] 967 920 return constSizer 968 constDel = wx.Button(pageDisplay, -1,'Delete',style=wx.BU_EXACTFIT)921 constDel = wx.Button(pageDisplay,wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT) 969 922 constDel.Bind(wx.EVT_BUTTON,OnConstDel) 970 923 Indx[constDel.GetId()] = [Id,name] … … 980 933 else: 981 934 constSizer.Add((-1,-1)) 982 constSizer.Add(wx.StaticText(pageDisplay, -1,typeString),935 constSizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,typeString), 983 936 0,wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER|wx.RIGHT|wx.LEFT,3) 937 if problemItem: eqString[-1] += ' -- Conflict: see console' 984 938 if len(eqString) > 1: 985 939 Eq = wx.BoxSizer(wx.VERTICAL) 986 940 for s in eqString: 987 Eq.Add(wx.StaticText(pageDisplay,-1,s),0,wx.ALIGN_CENTER_VERTICAL) 941 line = wx.StaticText(pageDisplay,wx.ID_ANY,s) 942 if problemItem: line.SetBackgroundColour(wx.YELLOW) 943 Eq.Add(line,0,wx.ALIGN_CENTER_VERTICAL) 944 Eq.Add((-1,4)) 988 945 else: 989 Eq = wx.StaticText(pageDisplay,-1,eqString[0]) 946 Eq = wx.StaticText(pageDisplay,wx.ID_ANY,eqString[0]) 947 if problemItem: Eq.SetBackgroundColour(wx.YELLOW) 990 948 constSizer.Add(Eq,1,wx.ALIGN_CENTER_VERTICAL) 991 949 return constSizer … … 1104 1062 G2frame.Page = [page,'glb'] 1105 1063 UpdateConstraintPanel(GlobalConstr,'Global') 1064 else: 1065 G2frame.Page = [page,'sym'] 1066 UpdateConstraintPanel(SymConstr,'Sym-Generated') 1067 G2frame.dataWindow.SetDataSize() 1106 1068 1107 1069 def RaisePage(event): … … 1150 1112 GlobalConstr = wx.ScrolledWindow(G2frame.constr) 1151 1113 G2frame.constr.AddPage(GlobalConstr,'Global') 1114 SymConstr = wx.ScrolledWindow(G2frame.constr) 1115 G2frame.constr.AddPage(SymConstr,'Sym-Generated') 1152 1116 wx.CallAfter(OnPageChanged,None) 1153 1117 G2frame.constr.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, OnPageChanged) … … 1158 1122 allcons += data[key] 1159 1123 if not len(allcons): return 1124 #reload(G2mv) # TODO: for testing 1160 1125 G2mv.InitVars() 1161 1126 constDictList,fixedList,ignored = G2stIO.ProcessConstraints(allcons) 1127 # generate symmetry constraints to check for conflicts 1128 rigidbodyDict = G2frame.GPXtree.GetItemPyData( 1129 G2gd.GetGPXtreeItemId(G2frame,G2frame.root,'Rigid bodies')) 1130 rbIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]}) 1131 rbVary,rbDict = G2stIO.GetRigidBodyModels(rigidbodyDict,Print=False) 1132 Natoms,atomIndx,phaseVary,phaseDict,pawleyLookup,FFtables,BLtables,MFtables,maxSSwave = G2stIO.GetPhaseData( 1133 Phases,RestraintDict=None,rbIds=rbIds,Print=False) # generates atom symmetry constraints 1162 1134 errmsg, warnmsg = G2mv.CheckConstraints('',constDictList,fixedList) 1163 1135 if errmsg: 1164 G2frame.ErrorDialog('Constraint Error','Error in constraints:\n'+errmsg, 1165 parent=G2frame) 1136 G2frame.ErrorDialog('Constraint Error', 1137 'Error in constraints:\n'+errmsg+'\nCheck console output for more information', 1138 parent=G2frame) 1139 print errmsg 1140 print G2mv.VarRemapShow([],True) 1166 1141 elif warnmsg: 1167 1142 print 'Unexpected contraint warning:\n',warnmsg … … 1391 1366 def AddVectorRB(event): 1392 1367 AtInfo = data['Vector']['AtInfo'] 1393 dlg = MultiIntegerDialog(G2frame,'New Rigid Body',['No. atoms','No. translations'],[1,1])1368 dlg = G2G.MultiIntegerDialog(G2frame,'New Rigid Body',['No. atoms','No. translations'],[1,1]) 1394 1369 if dlg.ShowModal() == wx.ID_OK: 1395 1370 nAtoms,nTrans = dlg.GetValues() -
TabularUnified trunk/GSASIIctrlGUI.py ¶
r3049 r3056 2581 2581 sizer.Fit(dlg) 2582 2582 dlg.ShowModal() 2583 2584 ################################################################################ 2585 class MultiIntegerDialog(wx.Dialog): 2586 '''Input a series of integers based on prompts 2587 ''' 2588 def __init__(self,parent,title,prompts,values): 2589 wx.Dialog.__init__(self,parent,-1,title, 2590 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE) 2591 self.panel = wx.Panel(self) #just a dummy - gets destroyed in Draw! 2592 self.values = values 2593 self.prompts = prompts 2594 self.Draw() 2595 2596 def Draw(self): 2597 2598 def OnValItem(event): 2599 event.Skip() 2600 Obj = event.GetEventObject() 2601 ind = Indx[Obj.GetId()] 2602 try: 2603 val = int(Obj.GetValue()) 2604 if val <= 0: 2605 raise ValueError 2606 except ValueError: 2607 val = self.values[ind] 2608 self.values[ind] = val 2609 Obj.SetValue('%d'%(val)) 2610 2611 self.panel.Destroy() 2612 self.panel = wx.Panel(self) 2613 mainSizer = wx.BoxSizer(wx.VERTICAL) 2614 Indx = {} 2615 for ival,[prompt,value] in enumerate(zip(self.prompts,self.values)): 2616 mainSizer.Add(wx.StaticText(self.panel,-1,prompt),0,wx.ALIGN_CENTER) 2617 valItem = wx.TextCtrl(self.panel,-1,value='%d'%(value),style=wx.TE_PROCESS_ENTER) 2618 mainSizer.Add(valItem,0,wx.ALIGN_CENTER) 2619 Indx[valItem.GetId()] = ival 2620 valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem) 2621 valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem) 2622 OkBtn = wx.Button(self.panel,-1,"Ok") 2623 OkBtn.Bind(wx.EVT_BUTTON, self.OnOk) 2624 CancelBtn = wx.Button(self.panel,-1,'Cancel') 2625 CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel) 2626 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 2627 btnSizer.Add((20,20),1) 2628 btnSizer.Add(OkBtn) 2629 btnSizer.Add(CancelBtn) 2630 btnSizer.Add((20,20),1) 2631 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 2632 self.panel.SetSizer(mainSizer) 2633 self.panel.Fit() 2634 self.Fit() 2635 2636 def GetValues(self): 2637 return self.values 2638 2639 def OnOk(self,event): 2640 parent = self.GetParent() 2641 parent.Raise() 2642 self.EndModal(wx.ID_OK) 2643 2644 def OnCancel(self,event): 2645 parent = self.GetParent() 2646 parent.Raise() 2647 self.EndModal(wx.ID_CANCEL) 2583 2648 2584 2649 ################################################################################ -
TabularUnified trunk/GSASIImapvars.py ¶
r3046 r3056 202 202 to parameter equations. The dict key is an ascii string, but the 203 203 dict value is a float. Unlikely to be used externally. 204 205 symGenList: 206 a list of boolean values that will be True to indicate that a constraint 207 (only equivalences) is generated by symmetry (or Pawley overlap) 208 209 problemVars: 210 a list containing variables that show up in constraints producing errors 204 211 205 212 *Routines* … … 227 234 fixedVarList = [] # List of variables that should not be refined 228 235 symGenList = [] # Flag if constraint is generated by symmetry 236 problemVars = [] # variables causing errors 229 237 230 238 # prefix for parameter names … … 329 337 errmsg = '' 330 338 warnmsg = '' 339 global problemVars 340 problemVars = [] 331 341 fixVlist = [] 332 342 # process fixed variables (holds) … … 358 368 if v in indepVarList: 359 369 errmsg += '\nVariable '+v+' is used to set values in a constraint before its value is set in another constraint\n' 370 if v not in problemVars: problemVars.append(v) 360 371 if m == 0: zeromult = True 361 372 if v in varyList: … … 389 400 s = '' 390 401 for var in sorted(set(multdepVarList)): 402 if v not in problemVars: problemVars.append(v) 391 403 if s != "": s+= ", " 392 404 s += str(var) … … 399 411 s = '' 400 412 for var in sorted(inboth): 413 if var not in problemVars: problemVars.append(var) 401 414 if s != "": s+= ", " 402 415 s += str(var) … … 422 435 if var in fixVlist: 423 436 errmsg += '\nParameter '+var+" is Fixed and used in a constraint:\n\t" 437 if var not in problemVars: problemVars.append(var) 424 438 errmsg += _FormatConstraint(constrDict[rel],fixedList[rel])+"\n" 425 439 if varied > 0 and varied != len(VarKeys(constrDict[rel])): … … 921 935 for v in fixedVarList: 922 936 s += ' ' + v + '\n' 923 s += ' Variable mapping relations:\n'937 s += 'User-supplied variable mapping relations:\n' 924 938 symout = '' 925 939 global dependentParmList,arrayList,invarrayList,indParmList,fixedDict,symGenList … … 929 943 for i,mv in enumerate(mapvars): 930 944 if multarr is None: 931 s1 = ' ' + str(mv) + ' is equivalent to parameter(s): ' 945 # s1 = ' ' + str(mv) + ' is equivalent to parameter(s): ' 946 if len(varlist) == 1: 947 s1 = ' ' + str(mv) + ' is equivalent to ' 948 else: 949 s1 = ' ' + str(mv) + ' is equivalent to parameters: ' 932 950 j = 0 933 951 for v,m in zip(varlist,invmultarr): … … 968 986 s += '\n' 969 987 return s 988 989 def GetSymEquiv(): 990 '''Return the automatically generated (equivalence) relationships. 991 992 :returns: a list of strings containing the details of the contraint relationships 993 ''' 994 symout = [] 995 global dependentParmList,arrayList,invarrayList,indParmList,fixedDict,symGenList 996 997 for varlist,mapvars,multarr,invmultarr,symFlag in zip( 998 dependentParmList,indParmList,arrayList,invarrayList,symGenList): 999 for i,mv in enumerate(mapvars): 1000 if not symFlag: continue 1001 if multarr is None: 1002 s1 = str(mv) + ' = ' 1003 j = 0 1004 for v,m in zip(varlist,invmultarr): 1005 if debug: print 'v,m[0]: ',v,m[0] 1006 if len(s1.split('\n')[-1]) > 75: s1 += '\n ' 1007 if j > 0: s1 += ' = ' 1008 j += 1 1009 s1 += str(v) 1010 if m != 1: 1011 s1 += " / " + str(m[0]) 1012 symout.append(s1) 1013 continue 1014 else: 1015 s = ' %s = ' % mv 1016 j = 0 1017 for m,v in zip(multarr[i,:],varlist): 1018 if m == 0: continue 1019 if j > 0: s += ' + ' 1020 j += 1 1021 s += '(%s * %s)' % (m,v) 1022 print 'unexpected sym op=',s 1023 return symout 970 1024 971 1025 def Dict2Deriv(varyList,derivDict,dMdv):
Note: See TracChangeset
for help on using the changeset viewer.