source: trunk/GSASIIElemGUI.py @ 2680

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

simplify a bit further; tested w/EPD on Mac & WinXP

  • 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: 2017-01-31 16:27:36 +0000 (Tue, 31 Jan 2017) $
4# $Author: toby $
5# $Revision: 2680 $
6# $URL: trunk/GSASIIElemGUI.py $
7# $Id: GSASIIElemGUI.py 2680 2017-01-31 16:27:36Z 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: 2680 $")
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 valence
29        ifNone if True show None button
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 = 50
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        self.color = color
75        if not self.ifNone and name[0] == 'None':
76            return
77        if self.oneOnly:
78            El = wscs.ColourSelect(label=name[0], parent=self,colour=color,
79                pos=pos, size=wx.Size(self.butWid,23), style=wx.RAISED_BORDER)
80            El.Bind(wx.EVT_BUTTON, self.OnElButton)
81        else:
82            butWid = self.butWid
83            if name[0] == 'None':
84                butWid *= 2
85            # patch for wx 2.9+ where EVT_COMBOBOX happens only on a value change.
86            i,j= wx.__version__.split('.')[0:2]
87            if int(i)+int(j)/10. > 2.8:
88                startname = name[0]+' '  # add an invisible space
89            else:
90                startname = name[0]
91            # Not ideal because wx.CB_READONLY is better.
92            El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,27),
93                    style=wx.CB_DROPDOWN, value=startname)
94            #El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
95            #        style=wx.CB_READONLY, value=name[0])
96            if sum(color)/3 < 150 and color[1] < 150: # background is mostly dark, use white letters
97                El.SetForegroundColour((255,255,255))
98            El.Bind(wx.EVT_COMBOBOX,self.OnElButton)
99       
100        El.SetBackgroundColour(color)
101        El.SetToolTipString(tip)
102
103    def OnElButton(self, event):
104        if self.oneOnly:
105            El = event.GetEventObject().GetLabel()
106        else:
107            El = event.GetEventObject().GetValue()
108        self.Elem = El
109        if self.multiple:
110            if El in self.elementList:
111                self.elementList.remove(El)
112                event.GetEventObject().SetBackgroundColour(self.color) # Shows on Mac
113            else:
114                self.elementList.append(El)
115                event.GetEventObject().SetBackgroundColour('black') # Shows on Mac
116            event.GetEventObject().SetColour(
117                wx.Colour(*[int(i/2) for i in event.GetEventObject().GetColour()]))
118        else:
119            self.EndModal(wx.ID_OK)
120
121    def OnClose(self,event):
122        self.EndModal(wx.ID_OK)
123               
124class PickElements(wx.Dialog):
125    """Makes periodic table widget for picking elements - caller maintains element list"""
126    Elem = []
127    def _init_ctrls(self, prnt,list):
128        wx.Dialog.__init__(self, id=-1, name='PickElements',
129              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(580, 360),
130              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Elements')
131        panel = wx.Panel(self)
132       
133        REcolor = wx.Colour(128, 128, 255)
134        Metcolor = wx.Colour(192, 192, 192)
135        Noblecolor = wx.Colour(255, 128, 255)
136        Alkcolor = wx.Colour(255, 255, 128)
137        AlkEcolor = wx.Colour(255, 128, 0)
138        SemMetcolor = wx.Colour(128, 255, 0)
139        NonMetcolor = wx.Colour(0, 255, 255)
140        White = wx.Colour(255, 255, 255)
141        self.Elem = []
142        for El in list:
143            self.Elem.append(El.lower().capitalize())
144       
145        self.ElTable = [
146            ("H",   0,0, "Hydrogen",    White,           0.0000),
147            ("He", 17,0, "Helium",      Noblecolor,      0.0000),
148            ("Li",  0,1, "Lithium",     Alkcolor,        0.0004),
149            ("Be",  1,1, "Beryllium",   AlkEcolor,       0.0006),
150            ("B",  12,1, "Boron",       NonMetcolor,     0.0012),
151            ("C",  13,1, "Carbon",      NonMetcolor,     0.0018),
152            ("N",  14,1, "Nitrogen",    NonMetcolor,     0.0030),
153            ("O",  15,1, "Oxygen",      NonMetcolor,     0.0042),
154            ("F",  16,1, "Fluorine",    NonMetcolor,     0.0054),
155            ("Ne", 17,1, "Neon",        Noblecolor,      0.0066),
156            ("Na",  0,2, "Sodium",      Alkcolor,        0.0084),
157            ("Mg",  1,2, "Magnesium",   AlkEcolor,       0.0110),
158            ("Al", 12,2, "Aluminum",    SemMetcolor,     0.0125),
159            ("Si", 13,2, "Silicon",     NonMetcolor,     0.0158),
160            ("P",  14,2, "Phosphorus",  NonMetcolor,     0.0180),
161            ("S",  15,2, "Sulphur",     NonMetcolor,     0.0210),
162            ("Cl", 16,2, "Chlorine",    NonMetcolor,     0.0250),
163            ("Ar", 17,2, "Argon",       Noblecolor,      0.0285),
164            ("K",   0,3, "Potassium",   Alkcolor,        0.0320),
165            ("Ca",  1,3, "Calcium",     AlkEcolor,       0.0362),
166            ("Sc",  2,3, "Scandium",    Metcolor,        0.0410),
167            ("Ti",  3,3, "Titanium",    Metcolor,        0.0460),
168            ("V",   4,3, "Vanadium",    Metcolor,        0.0510),
169            ("Cr",  5,3, "Chromium",    Metcolor,        0.0560),
170            ("Mn",  6,3, "Manganese",   Metcolor,        0.0616),
171            ("Fe",  7,3, "Iron",        Metcolor,        0.0680),
172            ("Co",  8,3, "Cobalt",      Metcolor,        0.0740),
173            ("Ni",  9,3, "Nickel",      Metcolor,        0.0815),
174            ("Cu", 10,3, "Copper",      Metcolor,        0.0878),
175            ("Zn", 11,3, "Zinc",        Metcolor,        0.0960),
176            ("Ga", 12,3, "Gallium",     SemMetcolor,      0.104),
177            ("Ge", 13,3, "Germanium",   SemMetcolor,      0.114),
178            ("As", 14,3, "Arsenic",     NonMetcolor,      0.120),
179            ("Se", 15,3, "Selenium",    NonMetcolor,      0.132),
180            ("Br", 16,3, "Bromine",     NonMetcolor,      0.141),
181            ("Kr", 17,3, "Krypton",     Noblecolor,       0.150),
182            ("Rb",  0,4, "Rubidium",    Alkcolor,         0.159),
183            ("Sr",  1,4, "Strontium",   AlkEcolor,        0.171),
184            ("Y",   2,4, "Yittrium",    Metcolor,         0.180),
185            ("Zr",  3,4, "Zirconium",   Metcolor,         0.192),
186            ("Nb",  4,4, "Niobium",     Metcolor,         0.204),
187            ("Mo",  5,4, "Molybdenium", Metcolor,         0.216),
188            ("Tc",  6,4, "Technetium",  Metcolor,         0.228),
189            ("Ru",  7,4, "Ruthenium",   Metcolor,         0.246),
190            ("Rh",  8,4, "Rhodium",     Metcolor,         0.258),
191            ("Pd",  9,4, "Palladium",   Metcolor,         0.270),
192            ("Ag", 10,4, "Silver",      Metcolor,         0.285),
193            ("Cd", 11,4, "Cadmium",     Metcolor,         0.300),
194            ("In", 12,4, "Indium",      SemMetcolor,      0.318),
195            ("Sn", 13,4, "Tin",         SemMetcolor,      0.330),
196            ("Sb", 14,4, "Antimony",    SemMetcolor,      0.348),
197            ("Te", 15,4, "Tellurium",   NonMetcolor,      0.363),
198            ("I",  16,4, "Iodine",      NonMetcolor,      0.384),
199            ("Xe", 17,4, "Xenon",       Noblecolor,       0.396),
200            ("Cs",  0,5, "Caesium",     Alkcolor,         0.414),
201            ("Ba",  1,5, "Barium",      AlkEcolor,        0.438),
202            ("La",  2,5, "Lanthanium",  Metcolor,         0.456),
203            ("Ce",  3.5,6.5, "Cerium",      REcolor,      0.474),
204            ("Pr",  4.5,6.5, "Praseodymium",REcolor,      0.492),
205            ("Nd",  5.5,6.5, "Neodymium",   REcolor,      0.516),
206            ("Pm",  6.5,6.5, "Promethium",  REcolor,      0.534),
207            ("Sm",  7.5,6.5, "Samarium",    REcolor,      0.558),
208            ("Eu",  8.5,6.5, "Europium",    REcolor,      0.582),
209            ("Gd",  9.5,6.5, "Gadolinium",  REcolor,      0.610),
210            ("Tb", 10.5,6.5, "Terbium",     REcolor,      0.624),
211            ("Dy", 11.5,6.5, "Dysprosium",  REcolor,      0.648),
212            ("Ho", 12.5,6.5, "Holmium",     REcolor,      0.672),
213            ("Er", 13.5,6.5, "Erbium",      REcolor,      0.696),
214            ("Tm", 14.5,6.5, "Thulium",     REcolor,      0.723),
215            ("Yb", 15.5,6.5, "Ytterbium",   REcolor,      0.750),
216            ("Lu", 16.5,6.5, "Lutetium",    REcolor,      0.780),
217            ("Hf",  3,5, "Hafnium",     Metcolor,         0.804),
218            ("Ta",  4,5, "Tantalum",    Metcolor,         0.834),
219            ("W",   5,5, "Tungsten",    Metcolor,         0.864),
220            ("Re",  6,5, "Rhenium",     Metcolor,         0.900),
221            ("Os",  7,5, "Osmium",      Metcolor,         0.919),
222            ("Ir",  8,5, "Iridium",     Metcolor,         0.948),
223            ("Pt",  9,5, "Platinium",   Metcolor,         0.984),
224            ("Au", 10,5, "Gold",        Metcolor,         1.014),
225            ("Hg", 11,5, "Mercury",     Metcolor,         1.046),
226            ("Tl", 12,5, "Thallium",    SemMetcolor,      1.080),
227            ("Pb", 13,5, "Lead",        SemMetcolor,      1.116),
228            ("Bi", 14,5, "Bismuth",     SemMetcolor,      1.149),
229            ("Po", 15,5, "Polonium",    SemMetcolor,      1.189),
230            ("At", 16,5, "Astatine",    NonMetcolor,      1.224),
231            ("Rn", 17,5, "Radon",       Noblecolor,       1.260),
232            ("Fr",  0,6, "Francium",    Alkcolor,         1.296),
233            ("Ra",  1,6, "Radium",      AlkEcolor,        1.332),
234            ("Ac",  2,6, "Actinium",    Metcolor,         1.374),
235            ("Th",  3.5,7.5, "Thorium",     REcolor,      1.416),
236            ("Pa",  4.5,7.5, "Protactinium",REcolor,      1.458),
237            ("U",   5.5,7.5, "Uranium",     REcolor,      1.470),
238            ("Np",  6.5,7.5, "Neptunium",   REcolor,      1.536),
239            ("Pu",  7.5,7.5, "Plutonium",   REcolor,      1.584),
240            ("Am",  8.5,7.5, "Americium",   REcolor,      1.626),
241            ("Cm",  9.5,7.5, "Curium",      REcolor,      1.669),
242            ("Bk", 10.5,7.5, "Berkelium",   REcolor,      1.716),
243            ("Cf", 11.5,7.5, "Californium", REcolor,      1.764)]
244           
245        mainSizer = wx.BoxSizer(wx.VERTICAL)
246        elPanel = wx.Panel(panel)
247           
248        i=0
249        for E in self.ElTable:
250            PickElements.ElButton(self,parent=elPanel,name=E[0],
251                pos=wx.Point(E[1]*30+20,E[2]*30+25),tip=E[3],color=E[4])
252            i+=1
253        mainSizer.Add(elPanel,0,wx.EXPAND)
254        mainSizer.Add((10,10),0)
255       
256        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
257        OkBtn = wx.Button(panel,-1,"Ok")
258        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
259        cancelBtn = wx.Button(panel,-1,"Cancel")
260        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
261        btnSizer.Add((20,20),1)
262        btnSizer.Add(OkBtn)
263        btnSizer.Add((20,20),1)
264        btnSizer.Add(cancelBtn)
265        btnSizer.Add((20,20),1)
266        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM, 10)
267        panel.SetSizer(mainSizer)
268        panel.Fit()
269                 
270    def OnOk(self,event):
271        if self.Elem:
272            self.EndModal(wx.ID_OK)
273        else:       
274            self.EndModal(wx.ID_CANCEL)       
275       
276    def OnCancel(self,event):
277        self.EndModal(wx.ID_CANCEL)       
278
279    def __init__(self, parent,list):
280        self._init_ctrls(parent,list)
281       
282    def ElButton(self, parent, name, pos, tip, color):
283        Black = wx.Colour(0,0,0)
284        if name in self.Elem:
285            color = Black
286        El = wscs.ColourSelect(label=name, parent=parent,colour=color,
287            pos=pos, size=wx.Size(32, 32), style=wx.RAISED_BORDER)
288        El.SetBackgroundColour(color)
289        El.SetLabel(name)
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(id=-1,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, id, 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.