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 Macro, Type

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