PLCControler.py
changeset 1951 bbd1e1744c91
parent 1950 752ec68da94d
child 1953 5736d25bb393
--- a/PLCControler.py	Mon Feb 19 15:46:50 2018 +0100
+++ b/PLCControler.py	Tue Feb 20 11:24:10 2018 +0100
@@ -43,6 +43,7 @@
 from plcopen.InstancesPathCollector import InstancesPathCollector
 from plcopen.POUVariablesCollector import POUVariablesCollector
 from plcopen.InstanceTagnameCollector import InstanceTagnameCollector
+from plcopen.VariableInfoCollector import VariableInfoCollector
 from graphics.GraphicCommons import *
 from PLCGenerator import *
 
@@ -74,60 +75,6 @@
 
 
 # -------------------------------------------------------------------------------
-#                 Helpers object for generating pou var list
-# -------------------------------------------------------------------------------
-
-
-class _VariableInfos(object):
-    __slots__ = ["Name", "Class", "Option", "Location", "InitialValue",
-                 "Edit", "Documentation", "Type", "Tree", "Number"]
-
-    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 _VariableInfos(*[getattr(self, attr) for attr in self.__slots__])
-
-
-class VariablesInfosFactory(object):
-
-    def __init__(self, variables):
-        self.Variables = variables
-        self.TreeStack = []
-        self.Type = None
-        self.Dimensions = None
-
-    def SetType(self, context, *args):
-        self.Type = args[0][0]
-
-    def GetType(self):
-        if len(self.Dimensions) > 0:
-            return ("array", self.Type, self.Dimensions)
-        return self.Type
-
-    def GetTree(self):
-        return (self.TreeStack.pop(-1), self.Dimensions)
-
-    def AddDimension(self, context, *args):
-        self.Dimensions.append(tuple(
-            _translate_args([_StringValue] * 2, args)))
-
-    def AddTree(self, context, *args):
-        self.TreeStack.append([])
-        self.Dimensions = []
-
-    def AddVarToTree(self, context, *args):
-        var = (args[0][0], self.Type, self.GetTree())
-        self.TreeStack[-1].append(var)
-
-    def AddVariable(self, context, *args):
-        self.Variables.append(_VariableInfos(*(
-            _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) +
-            [self.GetType(), self.GetTree()])))
-
-
-# -------------------------------------------------------------------------------
 #           Helpers object for generating pou block instances list
 # -------------------------------------------------------------------------------
 
@@ -385,6 +332,7 @@
         self.InstancesPathCollector = InstancesPathCollector(self)
         self.POUVariablesCollector = POUVariablesCollector(self)
         self.InstanceTagnameCollector = InstanceTagnameCollector(self)
+        self.VariableInfoCollector = VariableInfoCollector(self)
 
     # Reset PLCControler internal variables
     def Reset(self):
@@ -1162,21 +1110,8 @@
 
     def GetVariableDictionary(self, object_with_vars, tree=False, debug=False):
         variables = []
-        factory = VariablesInfosFactory(variables)
-
-        parser = etree.XMLParser()
-        parser.resolvers.add(LibraryResolver(self, debug))
-
-        variables_infos_xslt_tree = etree.XSLT(
-            etree.parse(
-                os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
-                parser),
-            extensions={("var_infos_ns", name): getattr(factory, name)
-                        for name in ["SetType", "AddDimension", "AddTree",
-                                     "AddVarToTree", "AddVariable"]})
-        variables_infos_xslt_tree(
-            object_with_vars, tree=etree.XSLT.strparam(str(tree)))
-
+        factory = self.VariableInfoCollector.Collect(object_with_vars,
+                                                     debug, variables, tree)
         return variables
 
     # Add a global var to configuration to configuration
@@ -1329,20 +1264,8 @@
             # Return the return type if there is one
             return_type = pou.interface.getreturnType()
             if return_type is not None:
-                factory = VariablesInfosFactory([])
-
-                parser = etree.XMLParser()
-                parser.resolvers.add(LibraryResolver(self))
-
-                return_type_infos_xslt_tree = etree.XSLT(
-                    etree.parse(
-                        os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
-                        parser),
-                    extensions={("var_infos_ns", name): getattr(factory, name)
-                                for name in ["SetType", "AddDimension",
-                                             "AddTree", "AddVarToTree"]})
-                return_type_infos_xslt_tree(
-                    return_type, tree=etree.XSLT.strparam(str(tree)))
+                factory = self.VariableInfoCollector.Collect(return_type, 
+                                                             debug, [], tree)
                 if tree:
                     return [factory.GetType(), factory.GetTree()]
                 return factory.GetType()