Changeset 410


Ignore:
Timestamp:
14.07.2011 15:55:21 (8 years ago)
Author:
marcus
Message:

More plotting:

  • refactoring
  • time stamp now correct
  • mouse indicator
Location:
SHX/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/patches/ObsPy.py

    r403 r410  
    187187 
    188188    self.shx.ImageData = lines 
     189    self.shx.PlotPixels = pixel_width 
    189190 
    190191def traceAddShxInit(self, *args, **kwargs): 
  • SHX/trunk/sandbox/traceplotter.py

    r409 r410  
    5555        self.Bind(wx.EVT_MOTION, self.OnMotion) 
    5656 
     57        self.overlay = wx.Overlay() 
     58        self.picklines = wx.Overlay() 
     59 
    5760        self.refresh = False 
    5861        self.relativeAxis = False 
     
    6770    def getTraceUnderCursor(self, x, y): 
    6871        if self.traceOrder in [0, 1]: 
    69             idx = int(float(y) / (self.heigth - TIMESCALE) * len(self.traces)) 
     72            idx = int(float(y) / (self.height - TIMESCALE) * len(self.traces)) 
    7073 
    7174            if self.traceOrder == 0: 
     
    8083            return None 
    8184 
     85    def ScreenToTraceAndTime(self, x, y): 
     86        """ 
     87        Returns trace instance and time code derived from cursor position inside 
     88        graphical panel. 
     89        """ 
     90        # horizontal display 
     91        if self.traceOrder in [0, 1]: 
     92            tracepos, timepos = y, x 
     93        # vertical display 
     94        elif self.traceOrder in [2, 3]: 
     95            tracepos, timepos = x, y 
     96 
     97        self._debug("XXX", "tracepos", tracepos, "timepos", timepos) 
     98 
     99        trace = None 
     100        for t in self.traces: 
     101            if tracepos >= t.shx.midpoint - self.traceheight // 2 and \ 
     102                             tracepos <= t.shx.midpoint + self.traceheight // 2: 
     103                self._debug(t.id, t.shx.plotoffset) 
     104                trace = t 
     105                break 
     106 
     107        # get time code 
     108        if trace and self.relativeAxis: 
     109            start = trace.stats.starttime 
     110            end = trace.stats.endtime 
     111            pixel_width = trace.shx.PlotPixels 
     112            # only needed for vertical plotting 
     113            length = self.height - STATION_INFO - MARGIN 
     114        else: 
     115            # global time axis 
     116            start = self.start 
     117            end = self.end 
     118            # horizontal 
     119            if self.traceOrder in [0, 1]: 
     120                pixel_width = self.width - STATION_INFO - MARGIN 
     121            # vertical 
     122            elif self.traceOrder in [2, 3]: 
     123                pixel_width = self.height - STATION_INFO - MARGIN 
     124 
     125        duration = end - start 
     126        timestamp = None 
     127        self._debug("XXX", start, end, duration) 
     128 
     129        # horizontal plotting 
     130        if self.traceOrder in [0, 1]: 
     131            timepos -= STATION_INFO 
     132        # vertical plotting 
     133        elif self.traceOrder == 2: 
     134            if self.relativeAxis: 
     135                timepos -= length + MARGIN 
     136            else: 
     137                timepos -= pixel_width + MARGIN 
     138            timepos *= -1 
     139        elif self.traceOrder == 3: 
     140            timepos -= STATION_INFO 
     141 
     142        t = timepos * duration / pixel_width 
     143        timestamp = start + t 
     144        self._debug("XXX", timepos, pixel_width, timestamp) 
     145 
     146        # do not return trace if timestamp is outside 
     147        pixel_duration = duration/pixel_width 
     148        if trace and (trace.stats.starttime > timestamp + pixel_duration or \ 
     149                              trace.stats.endtime + pixel_duration < timestamp): 
     150            trace = None 
     151 
     152        return trace, timestamp 
     153 
     154    def TraceAndTimeToScreen(self, trace, time): 
     155        """ 
     156        Return x, y from given trace and time code. 
     157        """ 
     158        pass 
     159 
    82160    def OnMotion(self, evt): 
    83161        x, y = evt.GetPositionTuple() 
    84         trace = self.getTraceUnderCursor(x, y) 
    85  
    86         if not trace or not self.relativeAxis or len(self.traces) == 1: 
    87             duration = self.end - self.start 
    88             start = self.start 
     162        trace, timestamp = self.ScreenToTraceAndTime(x, y) 
     163 
     164        # draw box 
     165        if evt.RightIsDown(): 
     166            pass 
     167        # draw position line 
    89168        else: 
    90             # get trace beneath cursor 
    91             start = trace.stats.starttime 
    92             duration = trace.stats.endtime - trace.stats.starttime 
    93  
    94         if self.traceOrder in [0, 1]: 
    95             x -= STATION_INFO 
    96             t = x * duration / (self.width - STATION_INFO - MARGIN) 
    97             timestamp = start + t 
    98         elif self.traceOrder == 2: 
    99             y -= MARGIN 
    100             t = y * duration / (self.heigth - STATION_INFO - MARGIN) 
    101             timestamp = start - t 
    102         elif self.traceOrder == 3: 
    103             y -= STATION_INFO 
    104             t = y * duration / (self.heigth - STATION_INFO - MARGIN) 
    105             timestamp = start + t 
     169            dc = wx.ClientDC(self) 
     170            odc = wx.DCOverlay(self.overlay, dc) 
     171            odc.Clear() 
     172            if trace: 
     173                dc.SetPen(wx.Pen("Blue", 1)) 
     174                dc.SetBrush(wx.TRANSPARENT_BRUSH) 
     175                if self.traceOrder in [0, 1]: 
     176                    dc.DrawLine( 
     177                        x, trace.shx.midpoint - self.traceheight // 2, \ 
     178                        x, trace.shx.midpoint + self.traceheight // 2 
     179                    ) 
     180                elif self.traceOrder in [2, 3]: 
     181                    dc.DrawLine( 
     182                        trace.shx.midpoint - self.traceheight // 2, y, 
     183                        trace.shx.midpoint + self.traceheight // 2, y 
     184                    ) 
     185            del odc 
    106186 
    107187        try: 
     
    120200        if not fnames: 
    121201            fnames = [None] 
     202            testTrace = True 
    122203 
    123204        for fname in fnames: 
     
    130211            except Exception, e: 
    131212                msg = e.message and e.message or "File not readable!" 
    132                 dlg = wx.MessageDialog(self, msg, "An error occured!", wx.OK | wx.ICON_ERROR) 
     213                dlg = wx.MessageDialog(self, msg, "An error occured!", \ 
     214                                                          wx.OK | wx.ICON_ERROR) 
    133215                dlg.ShowModal() 
    134216                dlg.Destroy() 
     
    136218                self._debug(e.message) 
    137219 
     220        try: 
     221            if testTrace: 
     222                t = self.traces[0].copy() 
     223                t.stats.network = "XX" 
     224                t.stats.channel = "EHA" 
     225                t.trim(t.stats.starttime+4, t.stats.endtime-10) 
     226                self.traces.add(t) 
     227                t = self.traces[0].copy() 
     228                t.stats.network = "XX" 
     229                t.stats.channel = "EHB" 
     230                t.trim(t.stats.starttime+10, t.stats.endtime-3) 
     231                self.traces.add(t) 
     232        except Exception, inst: 
     233            print inst 
     234            pass 
    138235        self.resetTimeRange() 
    139236 
     
    162259            self.refresh = False 
    163260 
    164     def OnPaint(self, evt): 
     261    def OnPaint(self, evt, renewOverlay=False): 
     262        # if window was resized, renew overlay buffers 
     263        if evt and (renewOverlay or evt.GetEventType() == wx.EVT_SIZE.typeId): 
     264            self.overlay = wx.Overlay() 
     265            self.picklines = wx.Overlay() 
     266         
     267        # painting is only done in idle state 
    165268        self.refresh = True 
    166269 
     
    179282 
    180283        self.width = width 
    181         self.heigth = height 
     284        self.height = height 
     285        self.traceheight = theight 
    182286 
    183287        # canvas holds the final figure 
     
    221325            # calculate offset 
    222326            plotStartSec = t.stats.starttime - start 
    223             offsetX = 0 
     327            plotoffset = 0 
    224328            if plotStartSec and not self.relativeAxis: 
    225329                # re-calculate offset 
    226330                portion = plotStartSec / (end - start) 
    227                 offsetX = portion * pltwidth 
    228                 self._debug(portion, offsetX) 
     331                plotoffset = portion * pltwidth 
     332                self._debug(portion, plotoffset) 
     333            t.shx.plotoffset = plotoffset 
    229334 
    230335            # transform data? 
     
    241346                # dito plus mirror x 
    242347                for line in t.shx.ImageData: 
    243                     ImageData.append([theight - line[1], line[0], theight - line[3], line[2]]) 
     348                    ImageData.append([theight - line[1], line[0], \ 
     349                                                    theight - line[3], line[2]]) 
    244350 
    245351            dc.BeginDrawing() 
     
    249355            # copy trace picture to canvas 
    250356            if self.traceOrder in [0, 1]: 
    251                 canvas.Blit(offsetX + STATION_INFO, i * theight, pltwidth, \ 
     357                canvas.Blit(plotoffset + STATION_INFO, i * theight, pltwidth, \ 
    252358                                                  theight, buffer, 0, 0, wx.AND) 
    253359            elif self.traceOrder == 2: 
    254                 print offsetX 
    255                 canvas.Blit(i * theight, -offsetX + MARGIN, theight, pltwidth, buffer, 0, 0, wx.AND) 
     360                canvas.Blit(i * theight, -plotoffset + MARGIN, theight, \ 
     361                                                pltwidth, buffer, 0, 0, wx.AND) 
    256362            elif self.traceOrder == 3: 
    257                 canvas.Blit(i * theight, STATION_INFO + offsetX, theight, pltwidth, buffer, 0, 0, wx.AND) 
     363                canvas.Blit(i * theight, STATION_INFO + plotoffset, theight, \ 
     364                                                 pltwidth, buffer, 0, 0, wx.AND) 
    258365 
    259366            # trace numbering 
     
    264371            txt = "%d: %s %s" % (idx, t.stats.station, t.stats.channel[-1]) 
    265372 
     373            canvas.SetPen(wx.Pen('Grey', 1, wx.LONG_DASH)) 
     374 
    266375            # place trace names 
    267376            w, h, _, _ = canvas.GetFullTextExtent(txt) 
     377            t.shx.midpoint = i * theight + theight//2 
    268378            if self.traceOrder in [0, 1]: 
    269                 canvas.DrawText(txt, 5, i * theight + theight//2 - h//2) 
     379                canvas.DrawText(txt, 5, t.shx.midpoint - h//2) 
     380                canvas.DrawLine(STATION_INFO, t.shx.midpoint, width-MARGIN, \ 
     381                                                                 t.shx.midpoint) 
     382                canvas.SetPen(wx.Pen('Red', 1, wx.LONG_DASH)) 
     383                canvas.DrawLine(STATION_INFO, t.shx.midpoint+theight//2, \ 
     384                                        width-MARGIN, t.shx.midpoint+theight//2) 
     385                canvas.DrawLine(STATION_INFO, t.shx.midpoint-theight//2, \ 
     386                                        width-MARGIN, t.shx.midpoint-theight//2) 
    270387            elif self.traceOrder == 2: 
    271                 canvas.DrawRotatedText(txt, i * theight + theight//2 - h//2, \ 
     388                canvas.DrawRotatedText(txt, t.shx.midpoint - h//2, \ 
    272389                                                            height - MARGIN, 90) 
     390                canvas.DrawLine(t.shx.midpoint, MARGIN, t.shx.midpoint, \ 
     391                                                            height-STATION_INFO) 
     392                canvas.SetPen(wx.Pen('Red', 1, wx.LONG_DASH)) 
     393                canvas.DrawLine(t.shx.midpoint+theight//2, MARGIN, \ 
     394                                 t.shx.midpoint+theight//2, height-STATION_INFO) 
     395                canvas.DrawLine(t.shx.midpoint-theight//2, MARGIN, \ 
     396                                 t.shx.midpoint-theight//2, height-STATION_INFO) 
    273397            elif self.traceOrder == 3: 
    274                 canvas.DrawRotatedText(txt, i * theight + theight//2 - h//2, \ 
     398                canvas.DrawRotatedText(txt, t.shx.midpoint - h//2, \ 
    275399                                         STATION_INFO - (STATION_INFO-w)//2, 90) 
     400                canvas.DrawLine(t.shx.midpoint, STATION_INFO, t.shx.midpoint, \ 
     401                                                                  height-MARGIN) 
     402                canvas.SetPen(wx.Pen('Red', 1, wx.LONG_DASH)) 
     403                canvas.DrawLine(t.shx.midpoint+theight//2, STATION_INFO, \ 
     404                                       t.shx.midpoint+theight//2, height-MARGIN) 
     405                canvas.DrawLine(t.shx.midpoint-theight//2, STATION_INFO, \ 
     406                                       t.shx.midpoint-theight//2, height-MARGIN) 
    276407 
    277408        # make it visible 
     
    284415        self.relativeAxis = evt.GetString() == "relative" 
    285416        if recent != self.relativeAxis: 
    286             self.OnPaint(evt) 
     417            self.OnPaint(evt, renewOverlay=True) 
    287418 
    288419    def onTraceOrder(self, evt): 
     
    290421        self.traceOrder = evt.GetSelection() 
    291422        if recent != self.traceOrder: 
    292             self.OnPaint(evt) 
     423            self.OnPaint(evt, renewOverlay=True) 
    293424 
    294425#        print [i for i in dir(self.parent.toolbar) if "id" in i.lower()] 
     
    298429class MyFrame(wx.Frame): 
    299430    def __init__(self, parent, title, size=(640,280)): 
    300         wx.Frame.__init__(self, parent, title=title, size=size, style=wx.DEFAULT_FRAME_STYLE | wx.FULL_REPAINT_ON_RESIZE) 
     431        wx.Frame.__init__(self, parent, title=title, size=size, \ 
     432                       style=wx.DEFAULT_FRAME_STYLE | wx.FULL_REPAINT_ON_RESIZE) 
    301433 
    302434        files = [] 
     
    316448        firstmenu = wx.Menu() 
    317449        readdb = wx.MenuItem(firstmenu, wx.NewId(), 'Re&ad...\tr') 
    318         readdb.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_OTHER, (16, 16))) 
     450        readdb.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, \ 
     451                                                        wx.ART_OTHER, (16, 16))) 
    319452        self.Bind(wx.EVT_MENU, self.onReadDb, id=readdb.GetId()) 
    320453        firstmenu.AppendItem(readdb) 
    321454 
    322455        read = wx.MenuItem(firstmenu, wx.NewId(), 'Read &file...\tCTRL+R') 
    323         read.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, (16, 16))) 
     456        read.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, \ 
     457                                                        wx.ART_OTHER, (16, 16))) 
    324458        self.Bind(wx.EVT_MENU, self.onRead, id=read.GetId()) 
    325459        firstmenu.AppendItem(read) 
    326460 
    327461        quit = wx.MenuItem(firstmenu, wx.NewId(), '&Quit\tCtrl+Q') 
    328         quit.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_OTHER, (16, 16))) 
     462        quit.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_QUIT, 
     463                                                        wx.ART_OTHER, (16, 16))) 
    329464        self.Bind(wx.EVT_MENU, self.onQuit, id=quit.GetId()) 
    330465        firstmenu.AppendItem(quit) 
     
    345480        msg = ' time-axis ' 
    346481        tb.AddControl(wx.StaticText(tb, -1, msg)) 
    347         timeaxis = wx.Choice(tb, wx.NewId(), (-1, -1), (-1, -1), ["absolute", "relative"]) 
     482        timeaxis = wx.Choice(tb, wx.NewId(), (-1, -1), (-1, -1), 
     483                                                       ["absolute", "relative"]) 
    348484        tb.AddControl(timeaxis) 
    349485        self.Bind(wx.EVT_CHOICE, self.canvas.onTimeAxis, timeaxis) 
     
    375511        self.filename = getattr(self, "filename", "") 
    376512        
    377         dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN | wx.FD_MULTIPLE) 
     513        dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", \ 
     514                                                       wx.OPEN | wx.FD_MULTIPLE) 
    378515 
    379516        files = [] 
     
    391528 
    392529    def onReadDb(self, evt): 
    393         dlg = wx.MessageDialog(self, "not implemented yet", "An error occured!", wx.OK) 
     530        dlg = wx.MessageDialog(self, "not implemented yet", \ 
     531                                                     "An error occured!", wx.OK) 
    394532        dlg.ShowModal() 
    395533        dlg.Destroy() 
Note: See TracChangeset for help on using the changeset viewer.