source: trunk/GSASIIElemGUI.py @ 1589

Last change on this file since 1589 was 1589, checked in by toby, 7 years ago

2 bugs: import phase w/invalid element; prevent 3 overlapped buttons for H in Periodic table

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