source: trunk/GSASIIElemGUI.py @ 4879

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

Add atom site fraction calculator for 2 atom shared sites

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