source: trunk/GSASIIElemGUI.py @ 2486

Last change on this file since 2486 was 2486, checked in by vondreele, 5 years ago

fix mag form factor lookup - some aren't chemical valences (e.g. Fe+4)
fix mag form factor periodic table - nonmagnetic atoms now not shown
fix powder reflection mark & diff curve placement issues
fix issues with mag structure drawings - fill unit cell, etc.
fix structure transform to make magnetic cells (still needs making of constraints)
fix problem of mustrain & hstrain coeff changes with change in space group
add print to file of covariance matrix - user request
fix magnetic moment site symmetry restrictions
work on mag structure factor calcs.
change EXP file importer to ignore magnetic symmetry from GSAS

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 13.9 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2016-10-12 18:06:57 +0000 (Wed, 12 Oct 2016) $
4# $Author: vondreele $
5# $Revision: 2486 $
6# $URL: trunk/GSASIIElemGUI.py $
7# $Id: GSASIIElemGUI.py 2486 2016-10-12 18:06:57Z vondreele $
8########### SVN repository information ###################
9'''
10*GSASIIElemGUI: GUI to select and delete element lists*
11-------------------------------------------------------
12
13Module to select elements from a periodic table and
14to delete an element from a list of selected elements.
15'''
16"""ElementGUI: class defn. for element GUIs
17   Copyright: 2008, Robert B. Von Dreele & Brian H. Toby (Argonne National Laboratory)
18"""
19
20import GSASIIpath
21GSASIIpath.SetVersionNumber("$Revision: 2486 $")
22import wx
23import os
24import wx.lib.colourselect as wscs
25class PickElement(wx.Dialog):
26    "Makes periodic table widget for picking element - caller maintains element list"
27    Elem=None
28    def _init_ctrls(self,prnt,ifMag=False):
29        wx.Dialog.__init__(self, id=-1, name='PickElement',
30              parent=prnt, pos=wx.DefaultPosition, 
31              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Element')
32        import ElementTable as ET
33        self.butWid = 60
34        if 'nt' in os.name:
35            self.butWid = 40
36        self.SetClientSize(wx.Size(50+18*self.butWid, 250))
37       
38        i=0
39        Elems = ET.ElTable
40        if ifMag:
41            Elems = ET.MagElTable
42        for E in Elems:
43            if E[1] < 0: continue
44            if self.oneOnly:
45                color=E[4]
46            else:
47                color=E[6]
48            self.ElButton(name=E[0],
49               pos=wx.Point(E[1]*self.butWid+25,E[2]*24+24),
50               tip=E[3],color=color)
51            i+=1
52
53    def __init__(self, parent,oneOnly=False,ifNone=False,ifMag=False):
54        'Needs a doc string'
55        self.oneOnly = oneOnly
56        self.ifNone = ifNone
57        self._init_ctrls(parent,ifMag=ifMag)
58       
59    def ElButton(self, name, pos, tip, color):
60        'Creates an element button widget'
61        Black = wx.Colour(0,0,0)
62        if not self.ifNone and name[0] == 'None':
63            return
64        if self.oneOnly:
65            El = wscs.ColourSelect(label=name[0], parent=self,colour=color,
66                pos=pos, size=wx.Size(self.butWid,23), style=wx.RAISED_BORDER)
67            El.Bind(wx.EVT_BUTTON, self.OnElButton)
68        else:
69            butWid = self.butWid
70            if name[0] == 'None':
71                butWid *= 2
72            # patch for wx 2.9+ on Mac where EVT_COMBOBOX happens only on
73            # value change. Not ideal because wx.CB_READONLY is better.
74            i,j= wx.__version__.split('.')[0:2]
75            if int(i)+int(j)/10. > 2.8 and 'wxOSX' in wx.PlatformInfo:
76
77                El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
78                    style=wx.CB_DROPDOWN, value=name[0]+' ') # add an invisible space
79            else:
80                El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
81                    style=wx.CB_READONLY, value=name[0]) 
82            El.Bind(wx.EVT_COMBOBOX,self.OnElButton)
83       
84        El.SetBackgroundColour(color)
85        El.SetToolTipString(tip)
86
87    def OnElButton(self, event):
88        if self.oneOnly:
89            El = event.GetEventObject().GetLabel()
90        else:
91            El = event.GetEventObject().GetValue()
92        self.Elem = El
93        self.EndModal(wx.ID_OK)       
94       
95class PickElements(wx.Dialog):
96    """Makes periodic table widget for picking elements - caller maintains element list"""
97    Elem = []
98    def _init_ctrls(self, prnt,list):
99        wx.Dialog.__init__(self, id=-1, name='PickElements',
100              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(580, 360),
101              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Elements')
102        panel = wx.Panel(self)
103       
104        REcolor = wx.Colour(128, 128, 255)
105        Metcolor = wx.Colour(192, 192, 192)
106        Noblecolor = wx.Colour(255, 128, 255)
107        Alkcolor = wx.Colour(255, 255, 128)
108        AlkEcolor = wx.Colour(255, 128, 0)
109        SemMetcolor = wx.Colour(128, 255, 0)
110        NonMetcolor = wx.Colour(0, 255, 255)
111        White = wx.Colour(255, 255, 255)
112        self.Elem = []
113        for El in list:
114            self.Elem.append(El.lower().capitalize())
115       
116        self.ElTable = [
117            ("H",   0,0, "Hydrogen",    White,           0.0000),
118            ("He", 17,0, "Helium",      Noblecolor,      0.0000),
119            ("Li",  0,1, "Lithium",     Alkcolor,        0.0004),
120            ("Be",  1,1, "Beryllium",   AlkEcolor,       0.0006),
121            ("B",  12,1, "Boron",       NonMetcolor,     0.0012),
122            ("C",  13,1, "Carbon",      NonMetcolor,     0.0018),
123            ("N",  14,1, "Nitrogen",    NonMetcolor,     0.0030),
124            ("O",  15,1, "Oxygen",      NonMetcolor,     0.0042),
125            ("F",  16,1, "Fluorine",    NonMetcolor,     0.0054),
126            ("Ne", 17,1, "Neon",        Noblecolor,      0.0066),
127            ("Na",  0,2, "Sodium",      Alkcolor,        0.0084),
128            ("Mg",  1,2, "Magnesium",   AlkEcolor,       0.0110),
129            ("Al", 12,2, "Aluminum",    SemMetcolor,     0.0125),
130            ("Si", 13,2, "Silicon",     NonMetcolor,     0.0158),
131            ("P",  14,2, "Phosphorus",  NonMetcolor,     0.0180),
132            ("S",  15,2, "Sulphur",     NonMetcolor,     0.0210),
133            ("Cl", 16,2, "Chlorine",    NonMetcolor,     0.0250),
134            ("Ar", 17,2, "Argon",       Noblecolor,      0.0285),
135            ("K",   0,3, "Potassium",   Alkcolor,        0.0320),
136            ("Ca",  1,3, "Calcium",     AlkEcolor,       0.0362),
137            ("Sc",  2,3, "Scandium",    Metcolor,        0.0410),
138            ("Ti",  3,3, "Titanium",    Metcolor,        0.0460),
139            ("V",   4,3, "Vanadium",    Metcolor,        0.0510),
140            ("Cr",  5,3, "Chromium",    Metcolor,        0.0560),
141            ("Mn",  6,3, "Manganese",   Metcolor,        0.0616),
142            ("Fe",  7,3, "Iron",        Metcolor,        0.0680),
143            ("Co",  8,3, "Cobalt",      Metcolor,        0.0740),
144            ("Ni",  9,3, "Nickel",      Metcolor,        0.0815),
145            ("Cu", 10,3, "Copper",      Metcolor,        0.0878),
146            ("Zn", 11,3, "Zinc",        Metcolor,        0.0960),
147            ("Ga", 12,3, "Gallium",     SemMetcolor,      0.104),
148            ("Ge", 13,3, "Germanium",   SemMetcolor,      0.114),
149            ("As", 14,3, "Arsenic",     NonMetcolor,      0.120),
150            ("Se", 15,3, "Selenium",    NonMetcolor,      0.132),
151            ("Br", 16,3, "Bromine",     NonMetcolor,      0.141),
152            ("Kr", 17,3, "Krypton",     Noblecolor,       0.150),
153            ("Rb",  0,4, "Rubidium",    Alkcolor,         0.159),
154            ("Sr",  1,4, "Strontium",   AlkEcolor,        0.171),
155            ("Y",   2,4, "Yittrium",    Metcolor,         0.180),
156            ("Zr",  3,4, "Zirconium",   Metcolor,         0.192),
157            ("Nb",  4,4, "Niobium",     Metcolor,         0.204),
158            ("Mo",  5,4, "Molybdenium", Metcolor,         0.216),
159            ("Tc",  6,4, "Technetium",  Metcolor,         0.228),
160            ("Ru",  7,4, "Ruthenium",   Metcolor,         0.246),
161            ("Rh",  8,4, "Rhodium",     Metcolor,         0.258),
162            ("Pd",  9,4, "Palladium",   Metcolor,         0.270),
163            ("Ag", 10,4, "Silver",      Metcolor,         0.285),
164            ("Cd", 11,4, "Cadmium",     Metcolor,         0.300),
165            ("In", 12,4, "Indium",      SemMetcolor,      0.318),
166            ("Sn", 13,4, "Tin",         SemMetcolor,      0.330),
167            ("Sb", 14,4, "Antimony",    SemMetcolor,      0.348),
168            ("Te", 15,4, "Tellurium",   NonMetcolor,      0.363),
169            ("I",  16,4, "Iodine",      NonMetcolor,      0.384),
170            ("Xe", 17,4, "Xenon",       Noblecolor,       0.396),
171            ("Cs",  0,5, "Caesium",     Alkcolor,         0.414),
172            ("Ba",  1,5, "Barium",      AlkEcolor,        0.438),
173            ("La",  2,5, "Lanthanium",  Metcolor,         0.456),
174            ("Ce",  3.5,6.5, "Cerium",      REcolor,      0.474),
175            ("Pr",  4.5,6.5, "Praseodymium",REcolor,      0.492),
176            ("Nd",  5.5,6.5, "Neodymium",   REcolor,      0.516),
177            ("Pm",  6.5,6.5, "Promethium",  REcolor,      0.534),
178            ("Sm",  7.5,6.5, "Samarium",    REcolor,      0.558),
179            ("Eu",  8.5,6.5, "Europium",    REcolor,      0.582),
180            ("Gd",  9.5,6.5, "Gadolinium",  REcolor,      0.610),
181            ("Tb", 10.5,6.5, "Terbium",     REcolor,      0.624),
182            ("Dy", 11.5,6.5, "Dysprosium",  REcolor,      0.648),
183            ("Ho", 12.5,6.5, "Holmium",     REcolor,      0.672),
184            ("Er", 13.5,6.5, "Erbium",      REcolor,      0.696),
185            ("Tm", 14.5,6.5, "Thulium",     REcolor,      0.723),
186            ("Yb", 15.5,6.5, "Ytterbium",   REcolor,      0.750),
187            ("Lu", 16.5,6.5, "Lutetium",    REcolor,      0.780),
188            ("Hf",  3,5, "Hafnium",     Metcolor,         0.804),
189            ("Ta",  4,5, "Tantalum",    Metcolor,         0.834),
190            ("W",   5,5, "Tungsten",    Metcolor,         0.864),
191            ("Re",  6,5, "Rhenium",     Metcolor,         0.900),
192            ("Os",  7,5, "Osmium",      Metcolor,         0.919),
193            ("Ir",  8,5, "Iridium",     Metcolor,         0.948),
194            ("Pt",  9,5, "Platinium",   Metcolor,         0.984),
195            ("Au", 10,5, "Gold",        Metcolor,         1.014),
196            ("Hg", 11,5, "Mercury",     Metcolor,         1.046),
197            ("Tl", 12,5, "Thallium",    SemMetcolor,      1.080),
198            ("Pb", 13,5, "Lead",        SemMetcolor,      1.116),
199            ("Bi", 14,5, "Bismuth",     SemMetcolor,      1.149),
200            ("Po", 15,5, "Polonium",    SemMetcolor,      1.189),
201            ("At", 16,5, "Astatine",    NonMetcolor,      1.224),
202            ("Rn", 17,5, "Radon",       Noblecolor,       1.260),
203            ("Fr",  0,6, "Francium",    Alkcolor,         1.296),
204            ("Ra",  1,6, "Radium",      AlkEcolor,        1.332),
205            ("Ac",  2,6, "Actinium",    Metcolor,         1.374),
206            ("Th",  3.5,7.5, "Thorium",     REcolor,      1.416),
207            ("Pa",  4.5,7.5, "Protactinium",REcolor,      1.458),
208            ("U",   5.5,7.5, "Uranium",     REcolor,      1.470),
209            ("Np",  6.5,7.5, "Neptunium",   REcolor,      1.536),
210            ("Pu",  7.5,7.5, "Plutonium",   REcolor,      1.584),
211            ("Am",  8.5,7.5, "Americium",   REcolor,      1.626),
212            ("Cm",  9.5,7.5, "Curium",      REcolor,      1.669),
213            ("Bk", 10.5,7.5, "Berkelium",   REcolor,      1.716),
214            ("Cf", 11.5,7.5, "Californium", REcolor,      1.764)]
215           
216        mainSizer = wx.BoxSizer(wx.VERTICAL)
217        elPanel = wx.Panel(panel)
218           
219        i=0
220        for E in self.ElTable:
221            PickElements.ElButton(self,parent=elPanel,name=E[0],
222                pos=wx.Point(E[1]*30+20,E[2]*30+25),tip=E[3],color=E[4])
223            i+=1
224        mainSizer.Add(elPanel,0,wx.EXPAND)
225        mainSizer.Add((10,10),0)
226       
227        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
228        OkBtn = wx.Button(panel,-1,"Ok")
229        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
230        cancelBtn = wx.Button(panel,-1,"Cancel")
231        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
232        btnSizer.Add((20,20),1)
233        btnSizer.Add(OkBtn)
234        btnSizer.Add((20,20),1)
235        btnSizer.Add(cancelBtn)
236        btnSizer.Add((20,20),1)
237        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM, 10)
238        panel.SetSizer(mainSizer)
239        panel.Fit()
240                 
241    def OnOk(self,event):
242        if self.Elem:
243            self.EndModal(wx.ID_OK)
244        else:       
245            self.EndModal(wx.ID_CANCEL)       
246       
247    def OnCancel(self,event):
248        self.EndModal(wx.ID_CANCEL)       
249
250    def __init__(self, parent,list):
251        self._init_ctrls(parent,list)
252       
253    def ElButton(self, parent, name, pos, tip, color):
254        Black = wx.Colour(0,0,0)
255        if name in self.Elem:
256            color = Black
257        El = wscs.ColourSelect(label=name, parent=parent,colour=color,
258            pos=pos, size=wx.Size(32, 32), style=wx.RAISED_BORDER)
259        El.SetBackgroundColour(color)
260        El.SetLabel(name)
261        El.SetToolTipString(tip)
262        El.Bind(wx.EVT_BUTTON, self.OnElButton)
263
264    def OnElButton(self, event):
265        Black = wx.Colour(0,0,0)
266        btn = event.GetEventObject()
267        El = btn.GetLabel()
268        if btn.GetColour() != Black:
269            for Elem in self.ElTable:
270                if El in Elem:
271                    ElColor = Elem[4]
272            if El in self.Elem:
273                btn.SetColour(ElColor)
274                self.Elem.remove(El)
275            else:
276                btn.SetColour(wx.Colour(255,0,0))
277                self.Elem.append(El)
278       
279class DeleteElement(wx.Dialog):
280    "Delete element from selected set widget"
281    def _init_ctrls(self, parent,choice):
282        l = len(choice)-1
283        wx.Dialog.__init__(self, id=-1, name='Delete', parent=parent, 
284              pos=wx.DefaultPosition, size=wx.Size(max(128,64+l*24), 87),
285              style=wx.DEFAULT_DIALOG_STYLE, title='Delete Element')
286        self.Show(True)
287        self.SetAutoLayout(True)
288        self.SetHelpText('Select element to delete')
289        self.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)
290
291        i = 0
292        Elem = []
293        for Elem in choice:
294            self.ElButton(id=-1,name=Elem,pos=wx.Point(16+i*24, 16))
295            i+=1
296             
297    def __init__(self, parent,choice):
298        DeleteElement.El = ' '
299        self._init_ctrls(parent,choice)
300
301    def ElButton(self, id, name, pos):
302        'Needs a doc string'
303        White = wx.Colour(255, 255, 255)
304        El = wscs.ColourSelect(label=name, parent=self, colour = White,
305            pos=pos, size=wx.Size(24, 23), style=wx.RAISED_BORDER)
306        El.Bind(wx.EVT_BUTTON, self.OnDeleteButton)
307   
308    def OnDeleteButton(self, event):
309        DeleteElement.El=event.GetEventObject().GetLabel()
310        self.EndModal(wx.ID_OK)
311       
312    def GetDeleteElement(self):
313        return DeleteElement.El
314       
315
Note: See TracBrowser for help on using the repository browser.