source: trunk/GSASIIElemGUI.py @ 2611

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

Change PDF defaults; option for multiple element addition (added to PDF); replace old single-spot mask option with new; stop overwriting image limits on Copy Controls

  • 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-05 04:46:36 +0000 (Thu, 05 Jan 2017) $
4# $Author: toby $
5# $Revision: 2611 $
6# $URL: trunk/GSASIIElemGUI.py $
7# $Id: GSASIIElemGUI.py 2611 2017-01-05 04:46: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: 2611 $")
22import wx
23import os
24import wx.lib.colourselect as wscs
25class PickElement(wx.Dialog):
26    '''Makes periodic table widget for picking element. Modes:
27        oneOnly if True element symbols are provided, otherwise select isotope
28        ifNone ?
29        ifMag if True present magnetic scatters only
30        multiple if True multiple elements can be selected
31    '''
32    Elem=None
33    def _init_ctrls(self,prnt,ifMag=False):
34        wx.Dialog.__init__(self, id=-1, name='PickElement',
35              parent=prnt, pos=wx.DefaultPosition, 
36              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Element')
37        import ElementTable as ET
38        self.butWid = 60
39        if 'nt' in os.name:
40            self.butWid = 40
41        self.SetClientSize(wx.Size(50+18*self.butWid, 250))
42       
43        i=0
44        Elems = ET.ElTable
45        if ifMag:
46            Elems = ET.MagElTable
47        for E in Elems:
48            if E[1] < 0: continue
49            if self.oneOnly:
50                color=E[4]
51            else:
52                color=E[6]
53            self.ElButton(name=E[0],
54               pos=wx.Point(E[1]*self.butWid+25,E[2]*24+24),
55               tip=E[3],color=color)
56            i+=1
57        if self.multiple:
58            b = wx.Button(self,wx.ID_CLOSE,
59                          pos=wx.Point(16.5*self.butWid+25,7.75*24+24),
60                          label="Done")
61            b.Bind(wx.EVT_BUTTON, self.OnClose)
62
63    def __init__(self, parent,oneOnly=False,ifNone=False,ifMag=False,multiple=False):
64        'Needs a doc string'
65        self.oneOnly = oneOnly
66        self.ifNone = ifNone
67        self.multiple = multiple
68        self._init_ctrls(parent,ifMag=ifMag)
69        self.elementList = []
70       
71    def ElButton(self, name, pos, tip, color):
72        'Creates an element button widget'
73        if not self.ifNone and name[0] == 'None':
74            return
75        if self.oneOnly:
76            El = wscs.ColourSelect(label=name[0], parent=self,colour=color,
77                pos=pos, size=wx.Size(self.butWid,23), style=wx.RAISED_BORDER)
78            El.Bind(wx.EVT_BUTTON, self.OnElButton)
79        else:
80            butWid = self.butWid
81            if name[0] == 'None':
82                butWid *= 2
83            # patch for wx 2.9+ on Mac where EVT_COMBOBOX happens only on
84            # value change. Not ideal because wx.CB_READONLY is better.
85            i,j= wx.__version__.split('.')[0:2]
86            if int(i)+int(j)/10. > 2.8 and 'wxOSX' in wx.PlatformInfo:
87
88                El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
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.