Moved system commands from hooke_cli to plugin.system.
[hooke.git] / hooke / plugin / cut.py
index 41cbedb0b130b3038a3ab252f776a241a40e5f74..369cfcc3b7fa86d49df9ac776a7953e8bd5f8e41 100644 (file)
@@ -1,47 +1,77 @@
-# -*- coding: utf-8 -*-
-class cutCommands(object):
-
-    def _plug_init(self):
-        self.cut_basecurrent=None
-        self.cut_basepoints=None
-
-
-
-
-    def do_cut(self,args):
-        '''
-CUT
-        (cut.py)
-        Cut the selected signal between two points.
-        With the first parameter you have to select the signal (for FS for example
-        you can select with "0" the approacing curve and 1 for the retracting
-       curve. This depend also on how many set of data you have on the graph).
-        With the second parameter you select the output name file for the selection.
-       The data is arranged in two simple column without a header, the first column
-       is the "x" data and the second the "y".
-        -----------------
-        Syntax: distance "whatset" "namefile"
-        '''
-        if len(args)==0:
-               print "This command need the number of the graph that you want save and a name for the output file."
-               return
-       
-       a=args.split()
-       
-       
-       whatset=int(a[0])
-       outfile=a[1]
-       plot=self._get_displayed_plot()
-
-        print 'Select two points'
-        points=self._measure_N_points(N=2, whatset=whatset)
-       minbound=min(points[0].index, points[1].index)
-       maxbound=max(points[0].index, points[1].index)
-        boundpoints=[minbound, maxbound]
-       yarr=plot.vectors[whatset][1][boundpoints[0]:boundpoints[1]]
-       xarr=plot.vectors[whatset][0][boundpoints[0]:boundpoints[1]]
-
-       f=open(outfile,'w+')
-       for i in range(len(yarr)):
-               f.write(str(xarr[i])+";"+str(yarr[i])+"\n")
+"""The `cut` module provides :class:`CutPlugin` and
+:class:`CutCommand`.
+"""
+
+from ..command import Command, Argument, Failure
+from ..plugin import Plugin
+
+
+class CutPlugin (Plugin):
+    def __init__(self):
+        super(CutPlugin, self).__init__(name='cut')
+
+    def commands(self):
+        return [CutCommand()]
+
+
+# Define common or complicated arguments
+
+def current_curve_callback(hooke, command, argument, value):
+    playlist = hooke.playlists.current()
+    if playlist == None:
+        raise Failure('No playlists loaded')
+    curve = playlist.current()
+    if curve == None:
+        raise Failure('No curves in playlist %s' % playlist.name)
+    return curve
+
+CurveArgument = Argument(
+    name='curve', type='curve', callback=current_curve_callback,
+    help="""
+:class:`hooke.curve.Curve` to cut from.  Defaults to the current curve.
+""".strip())
+
+
+# Define commands
+
+class CutCommand (Command):
+    """Cut the selected signal between two points and write it to a file.
+
+    The data is saved in TAB-delimited ASCII text, where the first column
+    is "x" and the second is "y".  There is no header row.
+    """
+    def __init__(self):
+        super(CutCommand, self).__init__(
+            name='cut',
+            arguments=[
+                CurveArgument,
+                Argument(name='block', aliases=['set'], type='int', default=0,
+                    help="""
+Data block to save.  For an approach/retract force curve, `0` selects
+the approacing curve and `1` selects the retracting curve.
+""".strip()),
+                Argument(name='bounds', type='point', optional=False, count=2,
+                         help="""
+Indicies of points bounding the selected data.
+""".strip()),
+                Argument(name='output', type='file', default='cut.dat',
+                         help="""
+File name for the output data.
+""".strip()),
+                ],
+            help=self.__doc__)
+
+    def _run(self, hooke, inqueue, outqueue, params):
+        if params['curve'] == None:
+            params['curve'] = hooke.playlists.current().current()
+
+       i_min = min([p.index for p in params['points']])
+       i_max = max([p.index for p in params['points']])
+
+       data = params['curve'][params['bound']]
+        cut_data = data[i_min:i_max+1,:] # slice rows from row-major data
+        # +1 to include data[i_max] row
+
+       f = open(params['output'], 'w')
+        cut_data.tofile(f, sep='\t')
         f.close()