source: trunk/GSASIIElemGUI.py @ 1573

Last change on this file since 1573 was 1208, checked in by vondreele, 11 years ago

complete contrast calculator for small angle data.
implement a Load substances from a file

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