diff -r 752ec68da94d -r bbd1e1744c91 PLCControler.py --- 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()