Changeset 2536


Ignore:
Timestamp:
Nov 19, 2016 9:58:51 PM (5 years ago)
Author:
toby
Message:

better tickmark movement animation; menu commands

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r2530 r2536  
    18351835        self.ErrorAnal.Append(id=wxID_PLOTCTRLCOPY,kind=wx.ITEM_NORMAL,text='Copy plot controls',
    18361836            help='Copy of PWDR plot controls')
    1837            
     1837        self.moveDiffCurve = self.ErrorAnal.Append(id=wx.ID_ANY,kind=wx.ITEM_NORMAL,text='Move diff. curve',
     1838            help='Click on position where difference curve is placed')
     1839        self.moveTickLoc = self.ErrorAnal.Append(id=wx.ID_ANY,kind=wx.ITEM_NORMAL,text='Move ticks',
     1840            help='Move mouse to where tick marks should be positioned')
     1841        self.moveTickSpc = self.ErrorAnal.Append(id=wx.ID_ANY,kind=wx.ITEM_NORMAL,text='Set tick space',
     1842            help='Click to set spacing between phase tick marks')
    18381843        self.PostfillDataMenu()
    18391844           
  • trunk/GSASIIplot.py

    r2533 r2536  
    14201420        olderr = np.seterr(invalid='ignore')
    14211421                                                   
     1422    def onMoveDiffCurve(event):
     1423        '''Respond to a menu command to move the difference curve.
     1424        '''
     1425        G2frame.itemPicked = DifLine[0]
     1426        G2frame.G2plotNB.Parent.Raise()
     1427        OnPick(None)
     1428
     1429    def onMoveTopTick(event):
     1430        '''Respond to a menu command to move the tick locations.
     1431        '''
     1432        if len(Page.phaseList) == 0:
     1433            print("there are tick marks (no phases)")
     1434            return
     1435        G2frame.itemPicked = Page.tickDict[Page.phaseList[0]]
     1436        G2frame.G2plotNB.Parent.Raise()
     1437        OnPick(None)
     1438               
     1439    def onMoveTickSpace(event):
     1440        '''Respond to a menu command to move the tick spacing.
     1441        '''
     1442        if len(Page.phaseList) == 0:
     1443            print("there are tick marks (no phases)")
     1444            return
     1445        G2frame.itemPicked = Page.tickDict[Page.phaseList[-1]]
     1446        G2frame.G2plotNB.Parent.Raise()
     1447        OnPick(None)
     1448       
    14221449    def OnPick(event):
    14231450        '''Respond to an item being picked. This usually means that the item
     
    14271454            '''Respond to dragging of a plot Marker
    14281455            '''
     1456            if event.xdata is None or event.ydata is None: return   # ignore if cursor out of window
    14291457            Page.canvas.restore_region(savedplot)
    14301458            G2frame.itemPicked.set_data([event.xdata], [event.ydata])
     
    14351463            '''Respond to dragging of a plot line
    14361464            '''
     1465            if event.xdata is None: return   # ignore if cursor out of window
    14371466            Page.canvas.restore_region(savedplot)
    14381467            coords = G2frame.itemPicked.get_data()
     
    14451474            '''Respond to dragging of the reflection tick marks
    14461475            '''
     1476            if event.ydata is None: return   # ignore if cursor out of window
     1477            Page.canvas.restore_region(savedplot)
     1478            if Page.pickTicknum:
     1479                refDelt = -(event.ydata-Pattern[0]['refOffset'])/Page.pickTicknum
     1480                refOffset = Pattern[0]['refOffset']
     1481            else:       #1st row of refl ticks
     1482                refOffset = event.ydata
     1483                refDelt = Pattern[0]['refDelt']
     1484            for pId,phase in enumerate(Page.phaseList):
     1485                pos = refOffset - pId*refDelt
     1486                coords = Page.tickDict[phase].get_data()
     1487                coords[1][:] = pos
     1488                Page.tickDict[phase].set_data(coords)
     1489                Page.figure.gca().draw_artist(Page.tickDict[phase])
     1490            Page.canvas.blit(Page.figure.gca().bbox)
     1491
     1492
     1493        def OnDragDiffCurve(event):
     1494            '''Respond to dragging of the difference curve
     1495            '''
     1496            if event.ydata is None: return   # ignore if cursor out of window
    14471497            Page.canvas.restore_region(savedplot)
    14481498            coords = G2frame.itemPicked.get_data()
    1449             #GSASIIpath.IPyBreak()
    1450             coords[1][:] = event.ydata
     1499            coords[1][:] += Page.diffOffset + event.ydata
     1500            Page.diffOffset = -event.ydata
    14511501            G2frame.itemPicked.set_data(coords)
    14521502            Page.figure.gca().draw_artist(G2frame.itemPicked)
    14531503            Page.canvas.blit(Page.figure.gca().bbox)
    14541504
    1455         def OnDragDiffCurve(event):
    1456             '''Respond to dragging of the difference curve
    1457             '''
    1458             Page.canvas.restore_region(savedplot)
    1459             coords = G2frame.itemPicked.get_data()
    1460             coords[1][:] += Page.diffOffset + event.ydata
    1461             Page.diffOffset = - event.ydata
    1462             G2frame.itemPicked.set_data(coords)
    1463             Page.figure.gca().draw_artist(G2frame.itemPicked)
    1464             Page.canvas.blit(Page.figure.gca().bbox)
    1465            
    1466         if G2frame.itemPicked is not None: return
     1505        if event is None: # called from a menu command rather than by click on mpl artist
     1506            mouse = 1
     1507            pick = G2frame.itemPicked
     1508        else:
     1509            if G2frame.itemPicked is not None: return
     1510            pick = event.artist
     1511            mouse = event.mouseevent
     1512            xpos = pick.get_xdata()
     1513            ypos = pick.get_ydata()
     1514            ind = event.ind
     1515            xy = list(zip(np.take(xpos,ind),np.take(ypos,ind))[0])
     1516            # convert from plot units
     1517            if G2frame.plotStyle['qPlot']:                              #qplot - convert back to 2-theta
     1518                xy[0] = G2lat.Dsp2pos(Parms,2*np.pi/xy[0])
     1519            elif G2frame.plotStyle['dPlot']:                            #dplot - convert back to 2-theta
     1520                xy[0] = G2lat.Dsp2pos(Parms,xy[0])
     1521            if G2frame.plotStyle['sqrtPlot']:
     1522                xy[1] = xy[1]**2
    14671523        PatternId = G2frame.PatternId
    14681524        try:
     
    14711527            return
    14721528        PickId = G2frame.PickId
    1473         pick = event.artist
    1474         mouse = event.mouseevent
    1475         xpos = pick.get_xdata()
    1476         ypos = pick.get_ydata()
    1477         ind = event.ind
    1478         xy = list(zip(np.take(xpos,ind),np.take(ypos,ind))[0])
    1479         # convert from plot units
    1480         if G2frame.plotStyle['qPlot']:                              #qplot - convert back to 2-theta
    1481             xy[0] = G2lat.Dsp2pos(Parms,2*np.pi/xy[0])
    1482         elif G2frame.plotStyle['dPlot']:                            #dplot - convert back to 2-theta
    1483             xy[0] = G2lat.Dsp2pos(Parms,xy[0])
    1484         if G2frame.plotStyle['sqrtPlot']:
    1485             xy[1] = xy[1]**2
    14861529        if G2frame.PatternTree.GetItemText(PickId) == 'Peak List':
    14871530            if ind.all() != [0] and ObsLine[0].get_label() in str(pick):    #picked a data point
     
    15541597            Plot = Page.figure.gca()
    15551598            if DifLine[0] is G2frame.itemPicked:  # pick of difference curve
    1556                 #pick.set_linestyle(':') # set line as dotted
    1557                 Page.canvas.draw() # refresh without dotted line & save bitmap
     1599                Page.canvas.draw() # save bitmap
    15581600                savedplot = Page.canvas.copy_from_bbox(Page.figure.gca().bbox)
    15591601                Page.diffOffset = Pattern[0]['delOffset']
    15601602                G2frame.cid = Page.canvas.mpl_connect('motion_notify_event', OnDragDiffCurve)
    1561                 #pick.set_linestyle('--') # back to dashed
    1562             else:                                 # pick of plot tick mark (anything else possible?)
    1563                 Page.canvas.draw() # refresh without dotted line & save bitmap
     1603            else:                         # pick of plot tick mark (is anything else possible?)
     1604                pick = str(G2frame.itemPicked).split('(',1)[1][:-1]
     1605                if pick not in Page.phaseList: # picked something other than a tickmark
     1606                    return
     1607                Page.pickTicknum = Page.phaseList.index(pick)
     1608                resetlist = []
     1609                for pId,phase in enumerate(Page.phaseList): # set the tickmarks to a lighter color
     1610                    col = Page.tickDict[phase].get_color()
     1611                    rgb = mpl.colors.ColorConverter().to_rgb(col)
     1612                    rgb_light = [(2 + i)/3. for i in rgb]
     1613                    resetlist.append((Page.tickDict[phase],rgb))
     1614                    Page.tickDict[phase].set_color(rgb_light)
     1615                    Page.tickDict[phase].set_zorder(99) # put on top
     1616                Page.canvas.draw() # refresh with dimmed tickmarks
    15641617                savedplot = Page.canvas.copy_from_bbox(Page.figure.gca().bbox)
     1618                for f,v in resetlist:  # reset colors back
     1619                    f.set_zorder(0)
     1620                    f.set_color(v) # reset colors back to original values
    15651621                G2frame.cid = Page.canvas.mpl_connect('motion_notify_event', OnDragTickmarks)
    1566                
    15671622           
    15681623        elif G2frame.PatternTree.GetItemText(PickId) == 'Background':
     
    15921647                return
    15931648               
    1594     def OnRelease(event): # mouse release from item pick or background pt add/move/del
     1649    def OnRelease(event):
     1650        '''This is called when the mouse button is released when a plot object is dragged
     1651        due to an item pick, or when invoked via a menu item (such as in onMoveDiffCurve),
     1652        or for background points, which may be added/moved/deleted here.
     1653        New peaks are also added here.
     1654        '''
    15951655        plotNum = G2frame.G2plotNB.plotList.index('Powder Patterns')
    15961656        Page = G2frame.G2plotNB.nb.GetPage(plotNum)
     
    15981658            Page.canvas.mpl_disconnect(G2frame.cid)
    15991659            G2frame.cid = None
     1660        if event.xdata is None or event.ydata is None: # ignore drag if cursor is outside of plot
     1661            wx.CallAfter(PlotPatterns,G2frame,plotType=plottype)
     1662            return
    16001663        if not G2frame.PickId:
    16011664            return
     1665       
    16021666        PickId = G2frame.PickId                             # points to item in tree
    16031667        if G2frame.PatternTree.GetItemText(PickId) == 'Background' and event.xdata:
     
    16371701       
    16381702        if G2frame.itemPicked is None: return
    1639         #GSASIIpath.IPyBreak()
    1640 #        if str(DifLine[0]) == str(G2frame.itemPicked):
    1641         if DifLine[0] is G2frame.itemPicked:
     1703        if DifLine[0] is G2frame.itemPicked:   # respond to dragging of the difference curve
    16421704            data = G2frame.PatternTree.GetItemPyData(PickId)
    16431705            ypos = event.ydata
     
    17061768#            GSASIIpath.IPyBreak()
    17071769            if Id:     
    1708                 Phases = G2frame.PatternTree.GetItemPyData(Id)
     1770                #Phases = G2frame.PatternTree.GetItemPyData(Id)
    17091771                pick = str(G2frame.itemPicked).split('(',1)[1][:-1]
    17101772                if 'line' not in pick:       #avoid data points, etc.
    17111773                    data = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)
    1712                     num = Phases.keys().index(pick)
     1774                    num = Page.phaseList.index(pick)
    17131775                    if num:
    17141776                        data[0]['refDelt'] = -(event.ydata-Pattern[0]['refOffset'])/num
     
    17331795        Page.canvas.mpl_connect('button_release_event', OnRelease)
    17341796        Page.canvas.mpl_connect('button_press_event',OnPress)
     1797    Phases = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId,'Reflection Lists'))
     1798    Page.phaseList = sorted(Phases.keys()) # define an order for phases (once!)
     1799    G2frame.dataFrame.Bind(wx.EVT_MENU, onMoveDiffCurve, id=G2frame.dataFrame.moveDiffCurve.GetId())
     1800    G2frame.dataFrame.Bind(wx.EVT_MENU, onMoveTopTick, id=G2frame.dataFrame.moveTickLoc.GetId())
     1801    G2frame.dataFrame.Bind(wx.EVT_MENU, onMoveTickSpace, id=G2frame.dataFrame.moveTickSpc.GetId())
     1802    if len(Page.phaseList) == 0:
     1803        G2frame.dataFrame.moveTickLoc.Enable(False)
     1804        G2frame.dataFrame.moveTickSpc.Enable(False)
     1805    elif len(Page.phaseList) == 1:
     1806        G2frame.dataFrame.moveTickLoc.Enable(True)
     1807        G2frame.dataFrame.moveTickSpc.Enable(False)
     1808    else:
     1809        G2frame.dataFrame.moveTickLoc.Enable(True)
     1810        G2frame.dataFrame.moveTickSpc.Enable(True)
     1811   
    17351812    # save information needed to reload from tree and redraw
    17361813    kwargs={'PatternName':G2frame.PatternTree.GetItemText(G2frame.PatternId)}
     
    21102187            refColors=['b','r','c','g','m','k']
    21112188            Phases = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId,'Reflection Lists'))
    2112             for pId,phase in enumerate(Phases):
     2189            Page.tickDict = {}
     2190            for pId,phase in enumerate(Page.phaseList):
    21132191                if 'list' in str(type(Phases[phase])):
    21142192                    continue
     
    21222200                pos = Pattern[0]['refOffset']-pId*Pattern[0]['refDelt']*np.ones_like(peak)
    21232201                if G2frame.plotStyle['qPlot']:
    2124                     Plot.plot(2*np.pi/peak.T[0],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
     2202                    Page.tickDict[phase],j = Plot.plot(2*np.pi/peak.T[0],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
    21252203                elif G2frame.plotStyle['dPlot']:
    2126                     Plot.plot(peak.T[0],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
     2204                    Page.tickDict[phase],j = Plot.plot(peak.T[0],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
    21272205                else:
    2128                     Plot.plot(peak.T[1],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
     2206                    Page.tickDict[phase],j = Plot.plot(peak.T[1],pos,refColors[pId%6]+'|',mew=1,ms=8,picker=3.,label=phase)
    21292207            if len(Phases):
    21302208                handles,legends = Plot.get_legend_handles_labels()  #got double entries in the legends for some reason
Note: See TracChangeset for help on using the changeset viewer.