Changeset 889 for SHX/trunk


Ignore:
Timestamp:
12/11/12 19:14:36 (8 years ago)
Author:
marcus
Message:
  • STW supports user interaction
  • minor changes
Location:
SHX/trunk/SeismicHandler
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/basics/codes.py

    r886 r889  
    2121# man managed version number 
    2222VERSION = "0.2" 
     23NAME = "Seismic Handler eXtended - SHX" 
    2324 
    2425SUCCESS = 1 
  • SHX/trunk/SeismicHandler/commands/reads.py

    r809 r889  
    119119 
    120120        if not len(mseed): 
    121             log_message("warning.command.reads", "No streams found!") 
     121            msg = "Waveform data base contains no information at all for %s" 
     122            log_message("warning.command.reads", msg % stations) 
    122123            return 1 
    123124 
  • SHX/trunk/SeismicHandler/commands/stw.py

    r888 r889  
    2929                raise ShxError("Graphics mode not active!") 
    3030            try: 
    31                 t1 = ui_event("selecttime", wait=True) 
     31                t1 = ui_event("input", wait=True, payload="relative") 
     32                self.parameters.append(t1) 
    3233                ui_event("cursor", payload="left") 
    33                 t2 = ui_event("selecttime", wait=True) 
     34                t2 = ui_event("input", wait=True, payload="relative") 
     35                self.parameters.append(t2) 
    3436            except: 
    3537                pass 
    3638            ui_event("cursor", payload="normal") 
    37             return 
    3839 
    3940        try: 
  • SHX/trunk/SeismicHandler/modules/wx_.py

    r888 r889  
    88import wx.lib.scrolledpanel as SP 
    99import time 
     10import math 
    1011from SeismicHandler.basics.messages import msgs, subscribe_ui_event, \ 
    1112                                                       log_message, get_runtime 
    1213from SeismicHandler.core import Traces 
     14from SeismicHandler.basics.codes import NAME, VERSION 
    1315from obspy.core import read, UTCDateTime 
    14 from obspy.core.util import AttribDict 
    1516from obspy.sh.core import fromUTCDateTime 
    1617 
     
    2728TIMESCALE_TICKS_MAJOR = 7 
    2829 
     30# regular checking of UI data 
     31TIME_SLOT = .03 
     32 
    2933# holds window instance 
    3034plotter = None 
     
    5761        self.phasename = "P" 
    5862        self.space = None 
     63        self.interactive = "time_trace" 
    5964 
    6065        self._setup() 
     
    7277        self.Bind(wx.EVT_SCROLLWIN, self.OnScroll) 
    7378        self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) 
     79        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyDown) 
    7480 
    7581        # messaging system 
     
    8793        pass 
    8894 
     95    def OnKeyDown(self, evt): 
     96        print "key" 
     97        kc = evt.GetKeyCode() 
     98        print kc 
     99        evt.Skip() 
     100#        if kc == ord("r"): 
     101 
    89102    def OnMouseLeftDouble(self, evt): 
    90103        trace, _ = self.ScreenToTraceAndTime(*(evt.GetPositionTuple())) 
     
    95108 
    96109    def OnMouseLeftDown(self, evt): 
    97 #        print "down", evt.ButtonDClick(wx.MOUSE_BTN_LEFT) 
    98 #        print "down", evt.ButtonDClick() 
    99110        self._captureMouse(evt) 
    100111        evt.Skip() 
     
    191202 
    192203        x, y = evt.GetPositionTuple() 
    193         trace, timestamp = self.ScreenToTraceAndTime(x, y) 
    194         if not trace: 
    195             evt.Skip() 
    196             return 
    197  
    198         if "picks" not in trace.shx: 
    199             trace.shx.picks = AttribDict() 
    200  
    201         if "manual" not in trace.shx.picks: 
    202             trace.shx.picks.manual = {} 
    203  
    204         trace.shx.picks.manual[self.phasename] = timestamp 
    205         msg = "phase '%s' associated to %s at %s" % ( 
    206                 self.phasename, 
    207                 trace.id, 
    208                 fromUTCDateTime(timestamp) 
    209         ) 
    210  
    211         self.parent.SetStatusText(msg) 
    212         self._debug(msg) 
    213         self._drawPicksAndZoom() 
     204        if self.interactive == "trace_time": 
     205            self.parent._user_selection = self.ScreenToTraceAndTime(x, y) 
     206        elif self.interactive == "relative": 
     207            self.parent._user_selection = self.ScreenToRelativeTime(x, y) 
     208        else: 
     209            raise NameError("unknown selection mode") 
     210        evt.Skip() 
     211 
     212#        print trace, timestamp 
     213#        if not trace: 
     214#            evt.Skip() 
     215#            return 
     216# 
     217#        if "picks" not in trace.shx: 
     218#            trace.shx.picks = AttribDict() 
     219# 
     220#        if "manual" not in trace.shx.picks: 
     221#            trace.shx.picks.manual = {} 
     222# 
     223#        trace.shx.picks.manual[self.phasename] = timestamp 
     224#        msg = "phase '%s' associated to %s at %s" % ( 
     225#                self.phasename, 
     226#                trace.id, 
     227#                fromUTCDateTime(timestamp) 
     228#        ) 
     229# 
     230#        self.parent.SetStatusText(msg) 
     231#        self._debug(msg) 
     232#        self._drawPicksAndZoom() 
    214233 
    215234    def OnScroll(self, evt): 
     
    238257            self._drawPicksAndZoom() 
    239258            self.refresh = False 
     259 
     260    def _set_modes(self, name, mode): 
     261        """ 
     262        Method for altering the selection mode. Intended to be called from 
     263        other threads using "CallAfter". 
     264        """ 
     265        setattr(self, name, mode) 
    240266 
    241267    def OnPaint(self, evt, renewOverlay=False): 
     
    304330 
    305331    # helper functions 
     332    def ScreenToRelativeTime(self, x, y): 
     333        """ 
     334        Returns relative time inside screen. 
     335        """ 
     336        x, y = self.CalcUnscrolledPosition((x,y)) 
     337        # horizontal display 
     338        if self.traceOrder in [0, 1]: 
     339            timepos = x 
     340        # vertical display 
     341        elif self.traceOrder in [2, 3]: 
     342            timepos = y 
     343 
     344        # horizontal 
     345        if self.traceOrder in [0, 1]: 
     346            pixel_width = self.width - STATION_INFO - MARGIN 
     347        # vertical 
     348        elif self.traceOrder in [2, 3]: 
     349            pixel_width = self.height - STATION_INFO - MARGIN 
     350 
     351        # horizontal plotting 
     352        if self.traceOrder in [0, 1]: 
     353            timepos -= STATION_INFO 
     354        # vertical plotting 
     355        elif self.traceOrder == 2: 
     356            if self.relativeAxis: 
     357                timepos -= length + MARGIN 
     358            else: 
     359                timepos -= pixel_width + MARGIN 
     360            timepos *= -1 
     361        elif self.traceOrder == 3: 
     362            timepos -= STATION_INFO 
     363 
     364        t = timepos * (self.relend - self.relstart) / pixel_width + self.relstart 
     365 
     366        return t 
     367 
     368 
    306369    def ScreenToTraceAndTime(self, x, y): 
    307370        """ 
     
    470533 
    471534    def _captureMouse(self, evt): 
    472         self._debug("_captureMouse") 
    473  
    474535        self.CaptureMouse() 
    475536 
     537        # create overlay 
    476538        dc = wx.ClientDC(self) 
    477539        odc = wx.DCOverlay(self.overlay_drag, dc) 
     
    479541 
    480542        self.dragStart = evt.GetPosition() 
     543        self._debug("mouse captured at", self.dragStart) 
    481544 
    482545    def _releaseMouse(self, evt): 
    483         self._debug("_releaseMouse") 
    484  
    485546        self.ReleaseMouse() 
    486547 
     
    491552        del odc 
    492553        self.overlay_drag.Reset() 
     554 
     555        self._debug("mouse released") 
    493556 
    494557    def _drawPicksAndZoom(self): 
     
    745808 
    746809        # sections with ticks and time string 
     810 
     811        prec = abs(int(round(1 / math.log10(chunk_t)))) 
     812        mask = "%%.%uf" % prec 
    747813        for i in range(int(PARTS)): 
    748814            if isinstance(start, UTCDateTime): 
    749                 timecode = start + i*chunk_t 
     815                timecode = start + i * chunk_t 
    750816                txt = timecode.strftime("%H:%M:%S.") + \ 
    751817                                             str(timecode.microsecond//1000) 
    752818            else: 
    753                 txt = str(start + i*chunk_t) 
     819                txt = mask % (start + i * chunk_t) 
    754820 
    755821            tw = canvas.GetFullTextExtent(txt)[0] 
     
    798864    @staticmethod 
    799865    def _debug(*args): 
    800         log_message('debug', " ".join([str(i) for i in args])) 
     866        log_message('debug.wx', " ".join([str(i) for i in args])) 
    801867 
    802868    def _resetTimeRange(self, **kwargs): 
     
    872938        self.SetPosition(position) 
    873939        self.canvas = traceCanvas(self, []) 
     940        self.CreateStatusBar() 
     941        self.SetStatusText("%s %s" % (NAME, VERSION)) 
    874942        self.Disable() 
    875943        self.Show() 
     
    891959 
    892960@ui_events 
    893 def __setCursor(mode): 
     961def __set_cursor(mode): 
    894962    """ 
     963    Interface method for altering cursor style on canvas. Thread-safe. 
    895964    """ 
    896965    mode = mode.lower() 
     
    906975    global plotter 
    907976    wx.CallAfter(plotter.canvas.SetCursor, myCursor) 
    908 subscribe_ui_event(__setCursor, "cursor") 
     977subscribe_ui_event(__set_cursor, "cursor") 
     978 
     979 
     980@ui_events 
     981def __select_gui(mode): 
     982    """ 
     983    Interface method for selecting time and/or trace by user interaction. While 
     984    UI remains responsive, everything waits for user input. 
     985 
     986    mode is one of the following commands: 
     987    - relative (screen coordinates to relative offset) - for selecting windows 
     988    - trace_time (trace under cursor and timestamp) - for picking 
     989    """ 
     990    global plotter 
     991    wx.CallAfter(plotter.canvas._set_modes, "interactive", mode) 
     992    plotter._user_selection = None 
     993    while plotter._user_selection is None: 
     994        time.sleep(TIME_SLOT) 
     995    return plotter._user_selection 
     996subscribe_ui_event(__select_gui, "input") 
Note: See TracChangeset for help on using the changeset viewer.