Changeset 1944


Ignore:
Timestamp:
Jul 22, 2015 4:14:29 PM (7 years ago)
Author:
vondreele
Message:

add G2HistDataDialog for editing e.g. orientation angles over all images - could be used elsewhere
fix problem of bad RefList? key on plotting new histograms
fix failure (file busy!) in GPXBackup

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrls.py

    r1911 r1944  
    525525        if event: event.Skip()
    526526
     527################################################################################
    527528class NumberValidator(wx.PyValidator):
    528529    '''A validator to be used with a TextCtrl to prevent
     
    719720        return  # Returning without calling event.Skip, which eats the keystroke
    720721
     722################################################################################
    721723class ASCIIValidator(wx.PyValidator):
    722724    '''A validator to be used with a TextCtrl to prevent
     
    20882090   
    20892091################################################################################
     2092class G2HistoDataDialog(wx.Dialog):
     2093    '''A dialog for editing histogram data globally.
     2094   
     2095    :param wx.Frame ParentFrame: reference to parent frame
     2096    :param str title: heading above list of choices
     2097    :param str header: Title to place on window frame
     2098    :param list ParmList: a list of names for the columns
     2099    :param list ParmFmt: a list of formatting strings for the columns
     2100    :param list: HistoList: a list of histogram names
     2101    :param list ParmData: a list of lists of data matched to ParmList; one for each item in HistoList
     2102    :param bool monoFont: If False (default), use a variable-spaced font;
     2103      if True use a equally-spaced font.
     2104    :param kw: optional keyword parameters for the wx.Dialog may
     2105      be included such as size [which defaults to `(320,310)`] and
     2106      style (which defaults to
     2107      ``wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.CENTRE | wx.OK | wx.CANCEL``);
     2108      note that ``wx.OK`` and ``wx.CANCEL`` controls the presence of the eponymous buttons in the dialog.
     2109    :returns: the modified ParmData
     2110   
     2111    '''
     2112
     2113    def __init__(self,parent, title, header,ParmList,ParmFmt,HistoList,ParmData,
     2114                 monoFont=False, **kw):
     2115
     2116        def OnOk(sevent):
     2117            parent.Raise()
     2118            self.EndModal(wx.ID_OK)
     2119           
     2120        def OnModify(event):
     2121            Obj = event.GetEventObject()
     2122            irow,it = Indx[Obj.GetId()]
     2123            try:
     2124                val = float(Obj.GetValue())
     2125            except ValueError:
     2126                val = self.ParmData[irow][it]
     2127            self.ParmData[irow][it] = val
     2128            Obj.SetValue(self.ParmFmt[it]%val)
     2129                       
     2130        # process keyword parameters, notably style
     2131        options = {'size':(600,310), # default Frame keywords
     2132                   'style':wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.CENTRE| wx.OK | wx.CANCEL,
     2133                   }
     2134        options.update(kw)
     2135        self.ParmList = ParmList
     2136        self.ParmFmt = ParmFmt
     2137        self.HistoList = HistoList
     2138        self.ParmData = ParmData
     2139        nCol = len(ParmList)
     2140        if options['style'] & wx.OK:
     2141            useOK = True
     2142            options['style'] ^= wx.OK
     2143        else:
     2144            useOK = False
     2145        if options['style'] & wx.CANCEL:
     2146            useCANCEL = True
     2147            options['style'] ^= wx.CANCEL
     2148        else:
     2149            useCANCEL = False       
     2150        # create the dialog frame
     2151        wx.Dialog.__init__(self,parent,wx.ID_ANY,header,**options)
     2152        panel = wxscroll.ScrolledPanel(self)
     2153        # fill the dialog
     2154        Sizer = wx.BoxSizer(wx.VERTICAL)
     2155        Sizer.Add((-1,5))
     2156        Sizer.Add(wx.StaticText(panel,label=title),0,WACV)
     2157        dataSizer = wx.FlexGridSizer(0,nCol+1,0,0)
     2158        self.sel = []
     2159        self.mod = []
     2160        Indx = {}
     2161        for item in ['Histogram',]+self.ParmList:
     2162            dataSizer.Add(wx.StaticText(panel,-1,label=' %10s '%(item)),0,WACV)
     2163        for irow,name in enumerate(self.HistoList):
     2164            dataSizer.Add(wx.StaticText(panel,label=name),0,WACV|wx.LEFT|wx.RIGHT,10)
     2165            for it,item in enumerate(self.ParmData[irow]):
     2166                dat = wx.TextCtrl(panel,-1,value=self.ParmFmt[it]%(item),style=wx.TE_PROCESS_ENTER)
     2167                dataSizer.Add(dat,0,WACV)
     2168                dat.Bind(wx.EVT_TEXT_ENTER,OnModify)
     2169                dat.Bind(wx.EVT_KILL_FOCUS,OnModify)
     2170                Indx[dat.GetId()] = [irow,it]
     2171        Sizer.Add(dataSizer)
     2172        Sizer.Add((-1,10))
     2173        # OK/Cancel buttons
     2174        btnsizer = wx.StdDialogButtonSizer()
     2175        if useOK:
     2176            self.OKbtn = wx.Button(panel, wx.ID_OK)
     2177            self.OKbtn.SetDefault()
     2178            btnsizer.AddButton(self.OKbtn)
     2179            self.OKbtn.Bind(wx.EVT_BUTTON, OnOk)
     2180        if useCANCEL:
     2181            btn = wx.Button(panel, wx.ID_CANCEL)
     2182            btnsizer.AddButton(btn)
     2183        btnsizer.Realize()
     2184        Sizer.Add((-1,5))
     2185        Sizer.Add(btnsizer,0,wx.ALIGN_LEFT,20)
     2186        Sizer.Add((-1,5))
     2187        # OK done, let's get outa here
     2188        panel.SetSizer(Sizer)
     2189        panel.SetAutoLayout(1)
     2190        panel.SetupScrolling()
     2191        Size = [450,375]
     2192        panel.SetSize(Size)
     2193        Size[0] += 25; Size[1]+= 25
     2194        self.SetSize(Size)
     2195       
     2196    def GetData(self):
     2197        'Returns the modified ParmData'
     2198        return self.ParmData
     2199   
     2200################################################################################
    20902201def ItemSelector(ChoiceList, ParentFrame=None,
    20912202                 title='Select an item',
     
    21622273    val = dlg.ShowModal()
    21632274
    2164 ################################################################################
    2165 ####
    21662275################################################################################
    21672276class OrderBox(wxscroll.ScrolledPanel):
     
    26522761################################################################################
    26532762#### Help support routines
    2654 ################################################################################
    26552763################################################################################
    26562764class MyHelp(wx.Menu):
  • trunk/GSASIIimgGUI.py

    r1936 r1944  
    964964            data['GonioAngles'][item] = value
    965965            Obj.SetValue('%8.2f'%(value))
     966           
     967        def OnGlobalEdit(event):
     968            Names = []
     969            Items = []
     970            if G2frame.PatternTree.GetCount():
     971                id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
     972                while id:
     973                    name = G2frame.PatternTree.GetItemText(id)
     974                    if 'IMG' in name:
     975                        ctrls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id,'Image Controls'))
     976                        Names.append(name)
     977                        Items.append(ctrls['GonioAngles'])
     978                    id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
     979                if len(Names) == 1:
     980                    G2frame.ErrorDialog('Nothing for global editing','There must be more than one "IMG" pattern')
     981                    return
     982                dlg = G2G.G2HistoDataDialog(G2frame,' Edit sample goniometer data:',
     983                    'Edit data',['Omega','Chi','Phi'],['%.2f','%.2f','%.2f'],Names,Items)
     984            try:
     985                if dlg.ShowModal() == wx.ID_OK:
     986                    result = dlg.GetData()
     987                    id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
     988                    while id:
     989                        name = G2frame.PatternTree.GetItemText(id)
     990                        if 'IMG' in name:
     991                            ctrls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id,'Image Controls'))
     992                            vals = Items[Names.index(name)]
     993                            ctrls['GonioAngles'] = vals
     994#                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls'),ctrls)
     995                        id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
     996            finally:
     997                dlg.Destroy()
     998                G2frame.PatternTree.SelectItem(G2frame.PickId)
    966999       
    9671000        gonioSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    9761009            ValObj[angle.GetId()] = i
    9771010            gonioSizer.Add(angle,0,WACV)
     1011        globEdit = wx.Button(G2frame.dataDisplay,-1,'Global edit')
     1012        globEdit.Bind(wx.EVT_BUTTON,OnGlobalEdit)
     1013        gonioSizer.Add(globEdit,0,WACV)
    9781014        return gonioSizer
    9791015       
  • trunk/GSASIIphsGUI.py

    r1940 r1944  
    42054205                            'Extinction':[0.0,False],'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]}}
    42064206                        refList = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Reflection Lists'))
    4207                         refList[generalData['Name']] = []                       
     4207                        refList[generalData['Name']] = {}                       
    42084208                    data['Histograms'] = UseList
    42094209                    wx.CallAfter(G2ddG.UpdateDData,G2frame,DData,data)
  • trunk/GSASIIplot.py

    r1933 r1944  
    17901790            Phases = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId,'Reflection Lists'))
    17911791            for pId,phase in enumerate(Phases):
    1792                 peaks = Phases[phase]['RefList']
     1792                peaks = Phases[phase].get('RefList',[])
    17931793                if not len(peaks):
    17941794                    continue
  • trunk/GSASIIstrIO.py

    r1923 r1944  
    480480    import distutils.file_util as dfu
    481481    GPXback = getBackupName(GPXfile,makeBack)
    482     dfu.copy_file(GPXfile,GPXback)
     482    tries = 0
     483    while True:
     484        try:
     485            dfu.copy_file(GPXfile,GPXback)
     486            break
     487        except:
     488            tries += 1
     489            if tries > 10:
     490                return GPXfile  #failed!
     491            time.sleep(1)           #just wait a second!         
    483492    return GPXback
    484493
Note: See TracChangeset for help on using the changeset viewer.