source: trunk/GSASIIElemGUI.py @ 2664

Last change on this file since 2664 was 2664, checked in by toby, 5 years ago

increase button size in periodic table on Mac/Linux?

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