Source code for sardana.macroserver.macros.sequence

##############################################################################
##
# This file is part of Sardana
##
# http://www.sardana-controls.org/
##
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
##
# Sardana is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
##
# Sardana is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
##
# You should have received a copy of the GNU Lesser General Public License
# along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################

"""This is the sequence macro module"""

__all__ = ["sequence"]

import xml.dom.minidom

from sardana.macroserver.macro import *

TAG_MACRO = 'macro'
TAG_PARAM = 'param'
TAG_PARAMREPEAT = 'paramrepeat'
TAG_REPEAT = 'repeat'
TAG_PARAMS = 'params'
TAG_SEQUENCE = 'sequence'

ATTRIBUTE_NAME = 'name'
ATTRIBUTE_VALUE = 'value'
ATTRIBUTE_INDEX = 'nr'
ATTRIBUTE_DESCRIPTION = 'description'
ATTRIBUTE_DEFVALUE = 'defvalue'
ATTRIBUTE_TYPE = 'type'
ATTRIBUTE_ALLOWEDHOOKS = 'allowedHooks'
ATTRIBUTE_HASPARAMS = 'hasParams'
ATTRIBUTE_MIN = 'min'


[docs]class sequence(Macro): """This macro executes a sequence of macros. As a parameter it receives a string which is a xml structure. These macros which allow hooks can nest another sequence (xml structure). In such a case, this macro is executed recursively.""" param_def = [ ['xml', Type.String, None, 'Xml string representing a sequence'] ]
[docs] def run(self, *pars): xmlDoc = xml.dom.minidom.parseString(pars[0]) macros = self.parseXml(xmlDoc) for macro in macros: self.runMacro(macro)
# self.pausePoint() def parseXml(self, xmlDoc): macros = [] sequenceElement = xmlDoc.getElementsByTagName(TAG_SEQUENCE)[0] childElement = sequenceElement.firstChild while childElement: if childElement.localName == TAG_MACRO: params, hookElement = self.parseMacro(childElement) macro = self.createMacro(params) if hookElement is not None: hook = self.createExecMacroHook([self.__class__.__name__, hookElement.toxml()]) macro.hooks = [hook] macros.append(macro) childElement = childElement.nextSibling return macros def parseMacro(self, xmlElement): name = str(xmlElement.getAttribute(ATTRIBUTE_NAME)) params = (name,) hookElement = None childElement = xmlElement.firstChild while childElement: if childElement.localName == TAG_PARAM: params += self.parseParam(childElement) elif childElement.localName == TAG_PARAMREPEAT: params += self.parseParamRepeat(childElement) elif childElement.localName == TAG_SEQUENCE: hookElement = childElement childElement = childElement.nextSibling return (params, hookElement) def parseParam(self, xmlElement): return (str(xmlElement.getAttribute(ATTRIBUTE_VALUE)),) def parseParamRepeat(self, xmlElement): params = () childElement = xmlElement.firstChild while childElement: if childElement.localName == TAG_REPEAT: params += self.parseRepeat(childElement) childElement = childElement.nextSibling return params def parseRepeat(self, xmlElement): params = () childElement = xmlElement.firstChild while childElement: if childElement.localName == TAG_PARAM: params += self.parseParam(childElement) elif childElement.localName == TAG_PARAMREPEAT: params += self.parseParamRepeat(childElement) childElement = childElement.nextSibling return params