diff --git a/src/sardana/macroserver/macro.py b/src/sardana/macroserver/macro.py index d0a32f6d5..d96c4b611 100644 --- a/src/sardana/macroserver/macro.py +++ b/src/sardana/macroserver/macro.py @@ -32,6 +32,7 @@ __all__ = ["OverloadPrint", "PauseEvent", "Hookable", "ExecMacroHook", "MacroFinder", "Macro", "macro", "iMacro", "imacro", + "MoveMacro", "movemacro", "MacroFunc", "Type", "Table", "List", "ViewOption", "LibraryError", "Optional", "StopException", "AbortException", "InterruptException"] @@ -65,6 +66,7 @@ from sardana.macroserver.msoptions import ViewOption from sardana.taurus.core.tango.sardana.pool import PoolElement +from sardana import sardanacustomsettings class OverloadPrint(object): @@ -2525,3 +2527,12 @@ def __init__(self, *args, **kwargs): def run(self, *args): return self._function(self, *args) + + +class MoveMacro(Macro, Hookable): + + hints = {'allowsHooks': ('pre-move', 'post-move')} + + enable_hooks = getattr(sardanacustomsettings, + 'PRE_POST_MOVE_HOOK_IN_MV', + True) diff --git a/src/sardana/macroserver/macros/hkl.py b/src/sardana/macroserver/macros/hkl.py index 45e24b0ec..08e6ca2c0 100644 --- a/src/sardana/macroserver/macros/hkl.py +++ b/src/sardana/macroserver/macros/hkl.py @@ -48,7 +48,7 @@ import numpy as np from sardana.sardanautils import py2_round -from sardana.macroserver.macro import Hookable, Macro, iMacro, Type +from sardana.macroserver.macro import Hookable, Macro, iMacro, Type, MoveMacro from sardana.macroserver.macros.scan import aNscan from sardana.macroserver.msexception import UnknownEnv @@ -196,14 +196,13 @@ def fl(self, ch, if mat: return regx.sub(repl, ch) -class br(Macro, _diffrac, Hookable): +class br(MoveMacro, _diffrac): """Move the diffractometer to the reciprocal space coordinates given by H, K and L. If a fourth parameter is given, the combination of angles to be set is the correspondig to the given index. The index of the angles combinations are then changed.""" - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = [ ['H', Type.String, None, "H value"], ['K', Type.String, None, "K value"], @@ -274,11 +273,10 @@ def run(self, H, K, L, AnglesIndex, FlagNotBlocking, FlagPrinting): hkl_values[l_idx], self.diffrac.WaveLength]) -class ubr(Macro, _diffrac, Hookable): +class ubr(MoveMacro, _diffrac): """Move the diffractometer to the reciprocal space coordinates given by H, K and L und update. """ - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = [ ["hh", Type.String, "Not set", "H position"], ["kk", Type.String, "Not set", "K position"], diff --git a/src/sardana/macroserver/macros/standard.py b/src/sardana/macroserver/macros/standard.py index cc1e4f7bc..6ec8321a1 100755 --- a/src/sardana/macroserver/macros/standard.py +++ b/src/sardana/macroserver/macros/standard.py @@ -41,11 +41,10 @@ from PyTango import DevState from sardana.macroserver.macro import Macro, macro, Type, ViewOption, \ - iMacro, Hookable + iMacro, Hookable, MoveMacro from sardana.macroserver.msexception import StopException, UnknownEnv from sardana.macroserver.scan.scandata import Record from sardana.macroserver.macro import Optional -from sardana import sardanacustomsettings ########################################################################## # @@ -460,10 +459,9 @@ def run(self, motor_list): self.execMacro('wm', motor_list, **Table.PrettyOpts) -class mv(Macro, Hookable): +class mv(MoveMacro): """Move motor(s) to the specified position(s)""" - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = [ ['motor_pos_list', [['motor', Type.Moveable, None, 'Motor to move'], @@ -471,25 +469,22 @@ class mv(Macro, Hookable): None, 'List of motor/position pairs'], ] - def run(self, motor_pos_list): - self.motors, positions = [], [] + def prepare(self, motor_pos_list): + self.motors, self.positions = [], [] for m, p in motor_pos_list: self.motors.append(m) - positions.append(p) - - enable_hooks = getattr(sardanacustomsettings, - 'PRE_POST_MOVE_HOOK_IN_MV', - True) + self.positions.append(p) - if enable_hooks: + def run(self, motor_pos_list): + if self.enable_hooks: for preMoveHook in self.getHooks('pre-move'): preMoveHook() - for m, p in zip(self.motors, positions): + for m, p in zip(self.motors, self.positions): self.debug("Starting %s movement to %s", m.getName(), p) motion = self.getMotion(self.motors) - state, pos = motion.move(positions) + state, pos = motion.move(self.positions) if state != DevState.ON: self.warning("Motion ended in %s", state.name) msg = [] @@ -497,7 +492,7 @@ def run(self, motor_pos_list): msg.append(motor.information()) self.info("\n".join(msg)) - if enable_hooks: + if self.enable_hooks: for postMoveHook in self.getHooks('post-move'): postMoveHook() @@ -511,20 +506,19 @@ def run(self, motor): self.info("Motor %s" % str(motor.stateObj.read().rvalue)) -class umv(Macro, Hookable): +class umv(MoveMacro): """Move motor(s) to the specified position(s) and update""" - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = mv.param_def def prepare(self, motor_pos_list, **opts): self.all_names = [] self.all_pos = [] - self.motors = [] + # self.motors = [] self.print_pos = False for motor, pos in motor_pos_list: self.all_names.append([motor.getName()]) - self.motors.append(motor) + #self.motors.append(motor) # here? pos, posObj = motor.getPosition(force=True), motor.getPositionObj() self.all_pos.append([pos]) posObj.subscribeEvent(self.positionChanged, motor) @@ -533,6 +527,7 @@ def run(self, motor_pos_list): self.print_pos = True try: mv, _ = self.createMacro('mv', motor_pos_list) + self.motors = mv.motors # or here? mv._setHooks(self.hooks) self.runMacro(mv) finally: @@ -564,10 +559,9 @@ def printAllPos(self): self.flushOutput() -class mvr(Macro, Hookable): +class mvr(MoveMacro): """Move motor(s) relative to the current position(s)""" - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = [ ['motor_disp_list', [['motor', Type.Moveable, None, 'Motor to move'], @@ -591,10 +585,9 @@ def run(self, motor_disp_list): self.runMacro(mv) -class umvr(Macro, Hookable): +class umvr(MoveMacro): """Move motor(s) relative to the current position(s) and update""" - hints = {'allowsHooks': ('pre-move', 'post-move')} param_def = mvr.param_def def run(self, motor_disp_list):