diff -r 533741e5075c -r aee0a7eb833a PLCControler.py --- a/PLCControler.py Wed Oct 09 10:57:20 2013 +0200 +++ b/PLCControler.py Wed Oct 09 22:00:23 2013 +0200 @@ -189,85 +189,54 @@ # Helpers object for generating pou variable instance list #------------------------------------------------------------------------------- -def class_extraction(el, prt): - if prt in ["pou", "variable"]: - pou_type = POU_TYPES.get(el.text) - if pou_type is not None: - return pou_type - return VAR_CLASS_INFOS[el.text][1] - return { +def class_extraction(value): + class_type = { "configuration": ITEM_CONFIGURATION, "resource": ITEM_RESOURCE, "action": ITEM_ACTION, "transition": ITEM_TRANSITION, - "program": ITEM_PROGRAM}.get(prt) - -PARAM_VALUE_EXTRACTION = { - "name": lambda el, prt: el.text, - "class": class_extraction, - "type": lambda el, prt: None if el.text == "None" else el.text, - "edit": lambda el, prt: el.text == "True", - "debug": lambda el, prt: el.text == "True", - "variables": lambda el, prt: [ - compute_instance_tree(chld) - for chld in el]} - -def compute_instance_tree(tree): - return {el.tag: - PARAM_VALUE_EXTRACTION[el.tag](el, tree.tag) - for el in tree} - -class IsEdited(etree.XSLTExtension): - - def __init__(self, controller, debug): - etree.XSLTExtension.__init__(self) - self.Controller = controller - self.Debug = debug - - def execute(self, context, self_node, input_node, output_parent): - typename = input_node.get("name") - project = self.Controller.GetProject(self.Debug) - output_parent.text = str(project.getpou(typename) is not None) - -class IsDebugged(etree.XSLTExtension): - - def __init__(self, controller, debug): - etree.XSLTExtension.__init__(self) - self.Controller = controller - self.Debug = debug - - def execute(self, context, self_node, input_node, output_parent): - typename = input_node.get("name") - project = self.Controller.GetProject(self.Debug) - pou_infos = project.getpou(typename) - if pou_infos is not None: - self.apply_templates(context, pou_infos, output_parent) - return - - datatype_infos = self.Controller.GetDataType(typename, self.Debug) - if datatype_infos is not None: - self.apply_templates(context, datatype_infos, output_parent) - return - - output_parent.text = "False" - -class PouVariableClass(etree.XSLTExtension): - - def __init__(self, controller, debug): - etree.XSLTExtension.__init__(self) - self.Controller = controller - self.Debug = debug - - def execute(self, context, self_node, input_node, output_parent): - pou_infos = self.Controller.GetPou(input_node.get("name"), self.Debug) - if pou_infos is not None: - self.apply_templates(context, pou_infos, output_parent) - return - - self.process_children(context, output_parent) - -pou_variables_xslt = etree.parse( - os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt")) + "program": ITEM_PROGRAM}.get(value) + if class_type is not None: + return class_type + + pou_type = POU_TYPES.get(value) + if pou_type is not None: + return pou_type + + var_type = VAR_CLASS_INFOS.get(value) + if var_type is not None: + return var_type[1] + + return None + +class _VariablesTreeItemInfos(object): + __slots__ = ["name", "var_class", "type", "edit", "debug", "variables"] + def __init__(self, *args): + for attr, value in zip(self.__slots__, args): + setattr(self, attr, value if value is not None else "") + def copy(self): + return _VariableTreeItem(*[getattr(self, attr) for attr in self.__slots__]) + +class VariablesTreeInfosFactory: + + def __init__(self): + self.Root = None + + def GetRoot(self): + return self.Root + + def SetRoot(self, context, *args): + self.Root = _VariablesTreeItemInfos( + *([''] + _translate_args( + [class_extraction, str] + [_BoolValue] * 2, + args) + [[]])) + + def AddVariable(self, context, *args): + if self.Root is not None: + self.Root.variables.append(_VariablesTreeItemInfos( + *(_translate_args( + [str, class_extraction, str] + [_BoolValue] * 2, + args) + [[]]))) #------------------------------------------------------------------------------- # Helpers object for generating instances path list @@ -799,20 +768,28 @@ pou_type = None project = self.GetProject(debug) if project is not None: + factory = VariablesTreeInfosFactory() + + parser = etree.XMLParser() + parser.resolvers.add(LibraryResolver(self, debug)) + pou_variable_xslt_tree = etree.XSLT( - pou_variables_xslt, extensions = { - ("pou_vars_ns", "is_edited"): IsEdited(self, debug), - ("pou_vars_ns", "is_debugged"): IsDebugged(self, debug), - ("pou_vars_ns", "pou_class"): PouVariableClass(self, debug)}) + etree.parse( + os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt"), + parser), + extensions = {("pou_vars_ns", name): getattr(factory, name) + for name in ["SetRoot", "AddVariable"]}) + obj = None words = tagname.split("::") if words[0] == "P": obj = self.GetPou(words[1], debug) - else: + elif words[0] != "D": obj = self.GetEditedElement(tagname, debug) if obj is not None: - return compute_instance_tree( - pou_variable_xslt_tree(obj).getroot()) + pou_variable_xslt_tree(obj) + return factory.GetRoot() + return None def GetInstanceList(self, root, name, debug = False):