plcopen/plcopen.py
changeset 2 93bc4c2cf376
parent 1 e9d01d824086
child 6 c8cf918ee7ea
equal deleted inserted replaced
1:e9d01d824086 2:93bc4c2cf376
     7 #Copyright (C): Edouard TISSERANT and Laurent BESSARD
     7 #Copyright (C): Edouard TISSERANT and Laurent BESSARD
     8 #
     8 #
     9 #See COPYING file for copyrights details.
     9 #See COPYING file for copyrights details.
    10 #
    10 #
    11 #This library is free software; you can redistribute it and/or
    11 #This library is free software; you can redistribute it and/or
    12 #modify it under the terms of the GNU Lesser General Public
    12 #modify it under the terms of the GNU General Public
    13 #License as published by the Free Software Foundation; either
    13 #License as published by the Free Software Foundation; either
    14 #version 2.1 of the License, or (at your option) any later version.
    14 #version 2.1 of the License, or (at your option) any later version.
    15 #
    15 #
    16 #This library is distributed in the hope that it will be useful,
    16 #This library is distributed in the hope that it will be useful,
    17 #but WITHOUT ANY WARRANTY; without even the implied warranty of
    17 #but WITHOUT ANY WARRANTY; without even the implied warranty of
    18 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    18 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    19 #Lesser General Public License for more details.
    19 #Lesser General Public License for more details.
    20 #
    20 #
    21 #You should have received a copy of the GNU Lesser General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
    25 from xml.parsers import expat
    25 from xmlclass import *
    26 from minixsv import pyxsval
       
    27 from random import *
       
    28 
       
    29 from types import *
       
    30 from datetime import *
       
    31 
       
    32 import sys,re
       
    33 
       
    34 classes = {}
       
    35 TimeType = time(0,0,0).__class__
       
    36 DateType = date(1,1,1).__class__
       
    37 DateTimeType = datetime(1,1,1,0,0,0).__class__
       
    38 
    26 
    39 """
    27 """
    40 Dictionary that makes the relation between var names in plcopen and displayed values
    28 Dictionary that makes the relation between var names in plcopen and displayed values
    41 """
    29 """
    42 VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars",
    30 VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars",
    47 Define in which order var types must be displayed
    35 Define in which order var types must be displayed
    48 """
    36 """
    49 VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"]
    37 VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"]
    50 
    38 
    51 """
    39 """
    52 Regular expression models for extracting dates and times from a string
       
    53 """
       
    54 time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2})')
       
    55 date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})')
       
    56 datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2})')
       
    57 
       
    58 """
       
    59 Define which action qualifier must be associated with a duration 
    40 Define which action qualifier must be associated with a duration 
    60 """
    41 """
    61 QualifierList = {"N" : False, "R" : False, "S" : False, "L" : True, "D" : True, 
    42 QualifierList = {"N" : False, "R" : False, "S" : False, "L" : True, "D" : True, 
    62     "P" : False, "P0" : False, "P1" : False, "SD" : True, "DS" : True, "SL" : True}
    43     "P" : False, "P0" : False, "P1" : False, "SD" : True, "DS" : True, "SL" : True}
    63 
    44 
    64 """
    45 PLCOpenClasses = {}
    65 pyxsval is not complete and the parts that are not supported print some error
    46 PLCOpenTypes = {}
    66 reports. This class is used for not displaying them
    47 GenerateClassesFromXSD("plcopen/TC6_XML_V10_B.xsd")
    67 """
    48 CreateClasses(PLCOpenClasses, PLCOpenTypes)
    68 class HolePseudoFile:
    49 
    69     """ Base class for file like objects to facilitate StdOut for the Shell."""
    50 if "dataType" in PLCOpenClasses:
    70     def __init__(self, output = None):
    51     cls = PLCOpenClasses["dataType"]
    71         if output is None: output = []
    52     cls.value = None
    72         self.output = output
    53     
    73 
    54     def getValue(self):
    74     def writelines(self, l):
    55         return self.value
    75         map(self.write, l)
    56     setattr(cls, "getValue", getValue)
    76 
    57     
    77     def write(self, s):
    58     def setValue(self, value):
    78         pass
    59         self.value = value
    79 
    60     setattr(cls, "setValue", setValue)
    80     def flush(self):
    61     
    81         pass
    62     def loadXMLTree(self, tree):
    82     
    63         self.value = tree.childNodes[1].nodeName
    83     def isatty(self):
    64     setattr(cls, "loadXMLTree", loadXMLTree)
    84         return false
    65     
    85 
    66     def generateXMLText(self, name, indent, extras = {}):
    86 """
    67         ind1, ind2 = getIndent(indent, name)
    87 This function calculates the number of whitespace for indentation
    68         text = ind1 + "<%s>\n"%name
    88 """
    69         ind3, ind4 = getIndent(indent + 1, self.value)
    89 def getIndent(indent, balise):
    70         text += ind3 + "<%s/>\n"%self.value
    90     first = indent * 2
    71         text += ind1 + "</%s>\n"%name
    91     second = first + len(balise) + 1
    72         return text
    92     return "\t".expandtabs(first), "\t".expandtabs(second)
    73     setattr(cls, "generateXMLText", generateXMLText)
    93 
    74 
    94 """
    75 if "formattedText" in PLCOpenClasses:
    95 This function recursively creates a definition of the classes and their attributes
    76     cls = PLCOpenClasses["formattedText"]
    96 for plcopen from the xsd file of plcopen opened in a DOM model
    77     cls.text = ""
    97 """
    78     
    98 def Generate_classes(tree, parent, sequence = False):
    79     def getText(self):
    99     attributes = {}
    80         return self.text
   100     inheritance = []
    81     setattr(cls, "getText", getText)
   101     if sequence:
    82     
   102         order = []
    83     def setText(self, text):
   103     # The lists of attributes and inheritance of the node are generated from the childrens 
    84         self.text = text
   104     for node in tree.childNodes:
    85     setattr(cls, "setText", setText)
   105         # We make fun of #text elements and all other tags that don't are xsd tags
    86     
   106         if node.nodeName != "#text" and node.nodeName.startswith("xsd:"):
    87     def loadXMLTree(self, tree):
   107             recursion = False
    88         self.text = GetAttributeValue(tree)
   108             name = node.nodeName[4:].encode()
    89         if len(self.text.splitlines()) > 1:
   109             
    90             self.text = self.text[1:].rstrip()
   110             # This tags defines an attribute of the class
    91     setattr(cls, "loadXMLTree", loadXMLTree)
   111             if name in ["element", "attribute"]:
    92     
   112                 nodename = GetAttributeValue(node._attrs["name"])
    93     def generateXMLText(self, name, indent, extras = {}):
   113                 if "type" in node._attrs:
    94         ind1, ind2 = getIndent(indent, name)
   114                     nodetype = GetAttributeValue(node._attrs["type"])
    95         if len(self.text.splitlines()) > 1:
   115                 else:
       
   116                     # The type of attribute is defines in the child tree so we generate a new class
       
   117                     # No name is defined so we create one from nodename and parent class name
       
   118                     # (because some different nodes can have the same name)
       
   119                     if parent:
       
   120                         classname = "%s_%s"%(parent, nodename)
       
   121                     else:
       
   122                         classname = nodename
       
   123                     Generate_classes(node, classname)
       
   124                     nodetype = "ppx:%s"%classname
       
   125                 if name == "attribute":
       
   126                     if "use" in node._attrs:
       
   127                         use = GetAttributeValue(node._attrs["use"])
       
   128                     else:
       
   129                         use = "optional"
       
   130                 if name == "element":
       
   131                     # If a tag can be written more than one time we define a list attribute
       
   132                     if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded":
       
   133                         nodetype = "%s[]"%nodetype
       
   134                     if "minOccurs" in node._attrs and GetAttributeValue(node._attrs["minOccurs"]) == "0":
       
   135                         use = "optional"
       
   136                     else:
       
   137                         use = "required"
       
   138                 attributes[nodename] = (nodetype, name, use)
       
   139                 if sequence:
       
   140                     order.append(nodename)
       
   141             
       
   142             # This tag defines a new class
       
   143             elif name == "complexType" or name == "simpleType":
       
   144                 if "name" in node._attrs:
       
   145                     classname = GetAttributeValue(node._attrs["name"])
       
   146                     super, attrs = Generate_classes(node, classname)
       
   147                 else:
       
   148                     classname = parent
       
   149                     super, attrs = Generate_classes(node, classname.split("_")[-1])
       
   150                 # When all attributes and inheritances have been extracted, the
       
   151                 # values are added in the list of classes to create
       
   152                 if classname not in classes:
       
   153                     classes[classname] = (super, attrs)
       
   154                 elif classes[classname] != (super, attrs):
       
   155                     print "A different class has already got %s for name"%classname
       
   156             
       
   157             # This tag defines an attribute that can have different types
       
   158             elif name == "choice":
       
   159                 super, attrs = Generate_classes(node, parent)
       
   160                 if "ref" in attrs.keys():
       
   161                     choices = attrs
       
   162                 else:
       
   163                     choices = {}
       
   164                     for attr, (attr_type, xml_type, write_type) in attrs.items():
       
   165                         choices[attr] = attr_type
       
   166                 if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded":
       
   167                     attributes["multichoice_content"] = choices
       
   168                     if sequence:
       
   169                         order.append("multichoice_content")
       
   170                 else:
       
   171                     attributes["choice_content"] = choices
       
   172                     if sequence:
       
   173                         order.append("choice_content")
       
   174             
       
   175             # This tag defines the order in which class attributes must be written
       
   176             # in plcopen xml file. We have to store this order like an attribute
       
   177             elif name in "sequence":
       
   178                 super, attrs, order = Generate_classes(node, parent, True)
       
   179                 if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded":
       
   180                     for attr, (attr_type, xml_type, write_type) in attrs.items():
       
   181                         attrs[attr] = ("%s[]"%attr_type, xml_type, write_type)
       
   182                 if "minOccurs" in node._attrs and GetAttributeValue(node._attrs["minOccurs"]) == "0":
       
   183                     for attr, (attr_type, xml_type, write_type) in attrs.items():
       
   184                         attrs[attr] = (attr_type, xml_type, "optional")
       
   185                 inheritance.extend(super)
       
   186                 attributes.update(attrs)
       
   187                 attributes["order"] = order
       
   188             
       
   189             # This tag defines of types
       
   190             elif name == "group":
       
   191                 if "name" in node._attrs:
       
   192                     nodename = GetAttributeValue(node._attrs["name"])
       
   193                     super, attrs = Generate_classes(node, None)
       
   194                     classes[nodename] = (super, {"group":attrs["choice_content"]})
       
   195                 elif "ref" in node._attrs:
       
   196                     if "ref" not in attributes:
       
   197                         attributes["ref"] = [GetAttributeValue(node._attrs["ref"])]
       
   198                     else:
       
   199                         attributes["ref"].append(GetAttributeValue(node._attrs["ref"]))
       
   200             
       
   201             # This tag define a base class for the node
       
   202             elif name == "extension":
       
   203                 super = GetAttributeValue(node._attrs["base"])
       
   204                 inheritance.append(super[4:])
       
   205                 recursion = True
       
   206                 
       
   207             # This tag defines a restriction on the type of attribute
       
   208             elif name == "restriction":
       
   209                 attributes["basetype"] = GetAttributeValue(node._attrs["base"])
       
   210                 recursion = True
       
   211             
       
   212             # This tag defines an enumerated type
       
   213             elif name == "enumeration":
       
   214                 if "enum" not in attributes:
       
   215                     attributes["enum"] = [GetAttributeValue(node._attrs["value"])]
       
   216                 else:
       
   217                     attributes["enum"].append(GetAttributeValue(node._attrs["value"]))
       
   218             
       
   219             # This tags defines a restriction on a numerical value
       
   220             elif name in ["minInclusive","maxInclusive"]:
       
   221                 if "limit" not in attributes:
       
   222                     attributes["limit"] = {}
       
   223                 if name == "minInclusive":
       
   224                     attributes["limit"]["min"] = eval(GetAttributeValue(node._attrs["value"]))
       
   225                 elif name == "maxInclusive":
       
   226                     attributes["limit"]["max"] = eval(GetAttributeValue(node._attrs["value"]))
       
   227             
       
   228             # This tag are not important but their childrens are. The childrens are then parsed. 
       
   229             elif name in ["complexContent", "schema"]:
       
   230                 recursion = True
       
   231             
       
   232             # We make fun of xsd documentation
       
   233             elif name in ["annotation"]:
       
   234                 pass
       
   235             
       
   236             else:
       
   237                 #print name
       
   238                 Generate_classes(node, parent)
       
   239             
       
   240             # Parse the childrens of node
       
   241             if recursion:
       
   242                 super, attrs = Generate_classes(node, parent)
       
   243                 inheritance.extend(super)
       
   244                 attributes.update(attrs)
       
   245     
       
   246     # if sequence tag have been found, order is returned
       
   247     if sequence:
       
   248         return inheritance, attributes, order
       
   249     else:
       
   250         return inheritance, attributes
       
   251 """
       
   252 Function that extracts data from a node
       
   253 """
       
   254 def GetAttributeValue(attr):
       
   255     if len(attr.childNodes) == 1:
       
   256         return attr.childNodes[0].data.encode()
       
   257     else:
       
   258         return ""
       
   259 
       
   260 """
       
   261 Funtion that returns the Python type and default value for a given xsd type
       
   262 """
       
   263 def GetTypeInitialValue(attr_type):
       
   264     type_compute = attr_type[4:].replace("[]", "")
       
   265     if attr_type.startswith("xsd:"):
       
   266         if type_compute == "boolean":
       
   267             return BooleanType, "False"
       
   268         elif type_compute in ["decimal","unsignedLong","long","integer"]:
       
   269             return IntType, "0"
       
   270         elif type_compute in ["string","anyURI","NMTOKEN"]:
       
   271             return StringType, "\"\""
       
   272         elif type_compute == "time":
       
   273             return TimeType, "time(0,0,0)"
       
   274         elif type_compute == "date":
       
   275             return DateType, "date(1,1,1)"
       
   276         elif type_compute == "dateTime":
       
   277             return DateTimeType, "datetime(1,1,1,0,0,0)"
       
   278         elif type_compute == "language":
       
   279             return StringType, "\"en-US\""
       
   280         else:
       
   281             print "Can't affect: %s"%type_compute
       
   282     elif attr_type.startswith("ppx:"):
       
   283         if type_compute in PLCOpenClasses:
       
   284             return PLCOpenClasses[type_compute],"%s()"%type_compute
       
   285 
       
   286 """
       
   287 Function that computes value from a python type (Only Boolean are critical because
       
   288 there is no uppercase in plcopen)
       
   289 """
       
   290 def ComputeValue(value):
       
   291     if type(value) == BooleanType:
       
   292         if value:
       
   293             return "true"
       
   294         else:
       
   295             return "false"
       
   296     else:
       
   297         return str(value)
       
   298 
       
   299 """
       
   300 Function that extracts a value from a string following the xsd type given
       
   301 """
       
   302 def GetComputedValue(attr_type, value):
       
   303     type_compute = attr_type[4:].replace("[]", "")
       
   304     if type_compute == "boolean":
       
   305          if value == "true":
       
   306              return True
       
   307          elif value == "false":
       
   308              return False
       
   309          else:
       
   310             raise ValueError, "\"%s\" is not a valid boolean!"%value
       
   311     elif type_compute in ["decimal","unsignedLong","long","integer"]:
       
   312         return int(value)
       
   313     elif type_compute in ["string","anyURI","NMTOKEN","language"]:
       
   314         return value
       
   315     elif type_compute == "time":
       
   316         result = time_model.match(value)
       
   317         if result:
       
   318             time_values = [int(v) for v in result.groups()]
       
   319             return time(*time_values)
       
   320         else:
       
   321             raise ValueError, "\"%s\" is not a valid time!"%value
       
   322     elif type_compute == "date":
       
   323         result = date_model.match(value)
       
   324         if result:
       
   325             date_values = [int(v) for v in result.groups()]
       
   326             return date(*date_values)
       
   327         else:
       
   328             raise ValueError, "\"%s\" is not a valid date!"%value
       
   329     elif type_compute == "dateTime":
       
   330         result = datetime_model.match(value)
       
   331         if result:
       
   332             datetime_values = [int(v) for v in result.groups()]
       
   333             return datetime(*datetime_values)
       
   334         else:
       
   335             raise ValueError, "\"%s\" is not a valid datetime!"%value
       
   336     else:
       
   337         print "Can't affect: %s"%type_compute
       
   338         return None
       
   339 
       
   340 """
       
   341 This is the Metaclass for PLCOpen element classes. It generates automatically
       
   342 the basic useful methods for manipulate the differents attributes of the classes
       
   343 """
       
   344 class MetaClass(type):
       
   345     
       
   346     def __init__(cls, name, bases, dict):
       
   347         super(MetaClass, cls).__init__(name, bases, {})
       
   348         #print name, bases, dict, "\n"
       
   349         initialValues = {}
       
   350         for attr, values in dict.items():
       
   351             if attr in ["order", "basetype"]:
       
   352                 pass
       
   353             
       
   354             # Class is a enumerated type
       
   355             elif attr == "enum":
       
   356                 value_type, initial = GetTypeInitialValue(dict["basetype"])
       
   357                 initialValues["value"] = "\"%s\""%values[0]
       
   358                 setattr(cls, "value", values[0])
       
   359                 setattr(cls, "setValue", MetaClass.generateSetEnumMethod(cls, values, value_type))
       
   360                 setattr(cls, "getValue", MetaClass.generateGetMethod(cls, "value"))
       
   361             
       
   362             # Class is a limited type
       
   363             elif attr == "limit":
       
   364                 value_type, initial = GetTypeInitialValue(dict["basetype"])
       
   365                 initial = 0
       
   366                 if "min" in values:
       
   367                     initial = max(initial, values["min"])
       
   368                 if "max" in values:
       
   369                     initial = min(initial, values["max"])
       
   370                 initialValues["value"] = "%d"%initial
       
   371                 setattr(cls, "value", initial)
       
   372                 setattr(cls, "setValue", MetaClass.generateSetLimitMethod(cls, values, value_type))
       
   373                 setattr(cls, "getValue", MetaClass.generateGetMethod(cls, "value"))
       
   374             
       
   375             # Class has an attribute that can have different value types
       
   376             elif attr == "choice_content":
       
   377                 setattr(cls, "content", None)
       
   378                 initialValues["content"] = "None"
       
   379                 setattr(cls, "deleteContent", MetaClass.generateDeleteMethod(cls, "content"))
       
   380                 setattr(cls, "setContent", MetaClass.generateSetChoiceMethod(cls, values))
       
   381                 setattr(cls, "getContent", MetaClass.generateGetMethod(cls, "content"))
       
   382             elif attr == "multichoice_content":
       
   383                 setattr(cls, "content", [])
       
   384                 initialValues["content"] = "[]"
       
   385                 setattr(cls, "appendContent", MetaClass.generateAppendChoiceMethod(cls, values))
       
   386                 setattr(cls, "insertContent", MetaClass.generateInsertChoiceMethod(cls, values))
       
   387                 setattr(cls, "removeContent", MetaClass.generateRemoveMethod(cls, "content"))
       
   388                 setattr(cls, "countContent", MetaClass.generateCountMethod(cls, "content"))
       
   389                 setattr(cls, "setContent", MetaClass.generateSetMethod(cls, "content", ListType))
       
   390                 setattr(cls, "getContent", MetaClass.generateGetMethod(cls, "content"))
       
   391             
       
   392             # It's an attribute of the class
       
   393             else:
       
   394                 attrname = attr[0].upper()+attr[1:]
       
   395                 attr_type, xml_type, write_type = values
       
   396                 value_type, initial = GetTypeInitialValue(attr_type)
       
   397                 # Value of the attribute is a list
       
   398                 if attr_type.endswith("[]"):
       
   399                     setattr(cls, attr, [])
       
   400                     initialValues[attr] = "[]"
       
   401                     setattr(cls, "append"+attrname, MetaClass.generateAppendMethod(cls, attr, value_type))
       
   402                     setattr(cls, "insert"+attrname, MetaClass.generateInsertMethod(cls, attr, value_type))
       
   403                     setattr(cls, "remove"+attrname, MetaClass.generateRemoveMethod(cls, attr))
       
   404                     setattr(cls, "count"+attrname, MetaClass.generateCountMethod(cls, attr))
       
   405                     setattr(cls, "set"+attrname, MetaClass.generateSetMethod(cls, attr, ListType))
       
   406                 else:
       
   407                     if write_type == "optional":
       
   408                         setattr(cls, attr, None)
       
   409                         initialValues[attr] = "None"
       
   410                         setattr(cls, "add"+attrname, MetaClass.generateAddMethod(cls, attr, initial))
       
   411                         setattr(cls, "delete"+attrname, MetaClass.generateDeleteMethod(cls, attr))
       
   412                     else:
       
   413                         setattr(cls, attr, initial)
       
   414                         initialValues[attr] = initial
       
   415                     setattr(cls, "set"+attrname, MetaClass.generateSetMethod(cls, attr, value_type))
       
   416                 setattr(cls, "get"+attrname, MetaClass.generateGetMethod(cls, attr))
       
   417         setattr(cls, "__init__", MetaClass.generateInitMethod(cls, bases, initialValues))
       
   418         setattr(cls, "loadXMLTree", MetaClass.generateLoadXMLTree(cls, bases, dict))
       
   419         setattr(cls, "generateXMLText", MetaClass.generateGenerateXMLText(cls, bases, dict))
       
   420         setattr(cls, "singleLineAttributes", True)
       
   421 
       
   422     """
       
   423     Method that generate the method for loading an xml tree by following the
       
   424     attributes list defined
       
   425     """
       
   426     def generateLoadXMLTree(cls, bases, dict):
       
   427         def loadXMLTreeMethod(self, tree):
       
   428             # If class is derived, values of inheritance classes are loaded
       
   429             for base in bases:
       
   430                 base.loadXMLTree(self, tree)
       
   431             # Class is a enumerated or limited value
       
   432             if "enum" in dict.keys() or "limit" in dict.keys():
       
   433                 attr_value = GetAttributeValue(tree)
       
   434                 attr_type = dict["basetype"]
       
   435                 val = GetComputedValue(attr_type, attr_value)
       
   436                 self.setValue(val)
       
   437             else:
       
   438                 
       
   439                 # Load the node attributes if they are defined in the list
       
   440                 for attrname, attr in tree._attrs.items():
       
   441                     if attrname in dict.keys():
       
   442                         attr_type, xml_type, write_type = dict[attrname]
       
   443                         attr_value = GetAttributeValue(attr)
       
   444                         if write_type != "optional" or attr_value != "":
       
   445                             # Extracts the value
       
   446                             if attr_type.startswith("xsd:"):
       
   447                                 val = GetComputedValue(attr_type, attr_value)
       
   448                             elif attr_type.startswith("ppx:"):
       
   449                                 val = eval("%s()"%attr_type[4:], globals().update(PLCOpenClasses))
       
   450                                 val.loadXMLTree(attr)
       
   451                             setattr(self, attrname, val)
       
   452                 
       
   453                 # Load the node childs if they are defined in the list
       
   454                 for node in tree.childNodes:
       
   455                     name = node.nodeName
       
   456                     # We make fun of #text elements
       
   457                     if name != "#text":
       
   458                         
       
   459                         # Class has an attribute that can have different value types
       
   460                         if "choice_content" in dict.keys() and name in dict["choice_content"].keys():
       
   461                             attr_type = dict["choice_content"][name]
       
   462                             # Extracts the value
       
   463                             if attr_type.startswith("xsd:"):
       
   464                                 attr_value = GetAttributeValue(node)
       
   465                                 if write_type != "optional" or attr_value != "":
       
   466                                     val = GetComputedValue(attr_type.replace("[]",""), attr_value)
       
   467                                 else:
       
   468                                     val = None
       
   469                             elif attr_type.startswith("ppx:"):
       
   470                                 val = eval("%s()"%attr_type[4:].replace("[]",""), globals().update(PLCOpenClasses))
       
   471                                 val.loadXMLTree(node)
       
   472                             # Stock value in content attribute
       
   473                             if val:
       
   474                                 if attr_type.endswith("[]"):
       
   475                                     if self.content:
       
   476                                         self.content["value"].append(val)
       
   477                                     else:
       
   478                                         self.content = {"name":name,"value":[val]}
       
   479                                 else:
       
   480                                     self.content = {"name":name,"value":val}
       
   481                         
       
   482                         # Class has a list of attributes that can have different value types
       
   483                         elif "multichoice_content" in dict.keys() and name in dict["multichoice_content"].keys():
       
   484                             attr_type = dict["multichoice_content"][name]
       
   485                             # Extracts the value
       
   486                             if attr_type.startswith("xsd:"):
       
   487                                 attr_value = GetAttributeValue(node)
       
   488                                 if write_type != "optional" or attr_value != "":
       
   489                                     val = GetComputedValue(attr_type, attr_value)
       
   490                                 else:
       
   491                                     val = None
       
   492                             elif attr_type.startswith("ppx:"):
       
   493                                 val = eval("%s()"%attr_type[4:], globals().update(PLCOpenClasses))
       
   494                                 val.loadXMLTree(node)
       
   495                             # Add to content attribute list
       
   496                             if val:
       
   497                                 self.content.append({"name":name,"value":val})
       
   498                         
       
   499                         # The node child is defined in the list
       
   500                         elif name in dict.keys():
       
   501                             attr_type, xml_type, write_type = dict[name]
       
   502                             # Extracts the value
       
   503                             if attr_type.startswith("xsd:"):
       
   504                                 attr_value = GetAttributeValue(node)
       
   505                                 if write_type != "optional" or attr_value != "":
       
   506                                     val = GetComputedValue(attr_type.replace("[]",""), attr_value)
       
   507                                 else:
       
   508                                     val = None
       
   509                             elif attr_type.startswith("ppx:"):
       
   510                                 val = eval("%s()"%attr_type[4:].replace("[]",""), globals().update(PLCOpenClasses))
       
   511                                 val.loadXMLTree(node)
       
   512                             # Stock value in attribute
       
   513                             if val:
       
   514                                 if attr_type.endswith("[]"):
       
   515                                     getattr(self, name).append(val)
       
   516                                 else:
       
   517                                     setattr(self, name, val)
       
   518         return loadXMLTreeMethod
       
   519 
       
   520     """
       
   521     Method that generates the method for generating an xml text by following the
       
   522     attributes list defined
       
   523     """
       
   524     def generateGenerateXMLText(cls, bases, dict):
       
   525         def generateXMLTextMethod(self, name, indent, extras = {}, derived = False):
       
   526             ind1, ind2 = getIndent(indent, name)
       
   527             if not derived:
       
   528                 text = ind1 + "<%s"%name
       
   529             else:
       
   530                 text = ""
       
   531             if len(bases) > 0:
       
   532                 base_extras = {}
       
   533             if "order" in dict.keys():
       
   534                 order = dict["order"]
       
   535             else:
       
   536                 order = []
       
   537             if "choice_content" in dict.keys() and "choice_content" not in order:
       
   538                 order.append("choice_content") 
       
   539             if "multichoice_content" in dict.keys() and "multichoice_content" not in order:
       
   540                 order.append("multichoice_content") 
       
   541             size = 0
       
   542             first = True
       
   543             for attr, value in extras.items():
       
   544                 if not first and not self.singleLineAttributes:
       
   545                     text += "\n%s"%(ind2)
       
   546                 text += " %s=\"%s\""%(attr, ComputeValue(value))
       
   547                 first = False
       
   548             for attr, values in dict.items():
       
   549                 if attr in ["order","choice_content","multichoice_content"]:
       
   550                     pass
       
   551                 elif attr in ["enum","limit"]:
       
   552                     if not derived:
       
   553                         text += ">%s</%s>\n"%(ComputeValue(self.value),name)
       
   554                     else:
       
   555                         text += ComputeValue(self.value)
       
   556                     return text
       
   557                 elif values[1] == "attribute":
       
   558                     value = getattr(self, attr, None)
       
   559                     if values[2] != "optional" or value != None:
       
   560                         if not first and not self.singleLineAttributes:
       
   561                             text += "\n%s"%(ind2)
       
   562                         if values[0].startswith("ppx"):
       
   563                             if len(bases) > 0:
       
   564                                 base_extras[attr] = value.getValue()
       
   565                             else:
       
   566                                 text += " %s=\"%s\""%(attr, ComputeValue(value.getValue()))
       
   567                         else:
       
   568                             if len(bases) > 0:
       
   569                                 base_extras[attr] = value
       
   570                             else:
       
   571                                 text += " %s=\"%s\""%(attr, ComputeValue(value))
       
   572                         first = False
       
   573             if len(bases) > 0:
       
   574                 first, new_text = bases[0].generateXMLText(self, name, indent, base_extras, True)
       
   575                 text += new_text
       
   576             else:
       
   577                 first = True
       
   578             ind3, ind4 = getIndent(indent + 1, name)
       
   579             for attr in order:
       
   580                 value = getattr(self, attr, None)
       
   581                 if attr == "choice_content":
       
   582                     if self.content:
       
   583                         if first:
       
   584                             text += ">\n"
       
   585                             first = False
       
   586                         value_type = dict[attr][self.content["name"]]
       
   587                         if value_type.startswith("xsd:"):
       
   588                             if value_type.endswith("[]"):
       
   589                                 for content in self.content["value"]:
       
   590                                     text += ind1 + "<%s>%s</%s>\n"%(self.content["name"], ComputeValue(content), self.content["name"])
       
   591                             else:
       
   592                                 text += ind1 + "<%s>%s</%s>\n"%(self.content["name"], ComputeValue(self.content["value"]), self.content["name"])
       
   593                         elif value_type.endswith("[]"):
       
   594                             for content in self.content["value"]:
       
   595                                 text += content.generateXMLText(self.content["name"], indent + 1)
       
   596                         else:
       
   597                             text += self.content["value"].generateXMLText(self.content["name"], indent + 1)
       
   598                 elif attr == "multichoice_content":
       
   599                     if len(self.content) > 0:
       
   600                         for element in self.content:
       
   601                             if first:
       
   602                                 text += ">\n"
       
   603                                 first = False
       
   604                             value_type = dict[attr][element["name"]]
       
   605                             if value_type.startswith("xsd:"):
       
   606                                 text += ind1 + "<%s>%s</%s>\n"%(element["name"], ComputeValue(element["value"]), element["name"])
       
   607                             else:
       
   608                                 text += element["value"].generateXMLText(element["name"], indent + 1)
       
   609                 elif dict[attr][2] != "optional" or value != None:
       
   610                     if dict[attr][0].endswith("[]"):
       
   611                         if first and len(value) > 0:
       
   612                             text += ">\n"
       
   613                             first = False
       
   614                         for element in value:
       
   615                             if dict[attr][0].startswith("xsd:"):
       
   616                                 text += ind3 + "<%s>%s</%s>\n"%(attr, ComputeValue(element), attr)
       
   617                             else:
       
   618                                 text += element.generateXMLText(attr, indent + 1)
       
   619                     else:
       
   620                         if first:
       
   621                             text += ">\n"
       
   622                             first = False
       
   623                         if dict[attr][0].startswith("xsd:"):
       
   624                             text += ind3 + "<%s>%s</%s>\n"%(attr, ComputeValue(value), attr)
       
   625                         else:
       
   626                             text += getattr(self, attr).generateXMLText(attr, indent + 1)
       
   627             if not derived:
       
   628                 if first:
       
   629                     text += "/>\n"
       
   630                 else:
       
   631                     text += ind1 + "</%s>\n"%(name)
       
   632                 return text
       
   633             else:
       
   634                 return first, text
       
   635         return generateXMLTextMethod
       
   636         
       
   637     """
       
   638     Methods that generates the different methods for setting and getting the attributes
       
   639     """
       
   640     
       
   641     def generateInitMethod(cls, bases, dict):
       
   642         def initMethod(self):
       
   643             for base in bases:
       
   644                 base.__init__(self)
       
   645             for attr, initial in dict.items():
       
   646                 setattr(self, attr, eval(initial, globals().update(PLCOpenClasses)))
       
   647         return initMethod
       
   648 
       
   649     def generateSetMethod(cls, attr, choice_type):
       
   650         def setMethod(self, value):
       
   651             setattr(self, attr, value)
       
   652         return setMethod
       
   653 
       
   654     def generateSetChoiceMethod(cls, attr_type):
       
   655         def setChoiceMethod(self, name, value):
       
   656             self.content = {"name":name,"value":value}
       
   657         return setChoiceMethod
       
   658 
       
   659     def generateSetEnumMethod(cls, enum, attr_type):
       
   660         def setEnumMethod(self, value):
       
   661             if value in enum:
       
   662                 self.value = value
       
   663             else:
       
   664                 raise ValueError, "%s is not a valid value. Must be in %s"%(value, str(enum))
       
   665         return setEnumMethod
       
   666 
       
   667     def generateSetLimitMethod(cls, limit, attr_type):
       
   668         def setMethod(self, value):
       
   669             if "min" in limit and value < limit["min"]:
       
   670                 raise ValueError, "%s is not a valid value. Must be greater than %d"%(value, limit["min"])
       
   671             elif "max" in limit and value > limit["max"]:
       
   672                 raise ValueError, "%s is not a valid value. Must be smaller than %d"%(value, limit["max"])
       
   673             else:
       
   674                 self.value = value
       
   675         return setMethod
       
   676 
       
   677     def generateGetMethod(cls, attr):
       
   678         def getMethod(self):
       
   679             return getattr(self, attr, None)
       
   680         return getMethod
       
   681 
       
   682     def generateAddMethod(cls, attr, initial):
       
   683         def addMethod(self):
       
   684             setattr(self, attr, eval(initial, globals().update(PLCOpenClasses)))
       
   685         return addMethod
       
   686 
       
   687     def generateDeleteMethod(cls, attr):
       
   688         def deleteMethod(self):
       
   689             setattr(self, attr, None)
       
   690         return deleteMethod
       
   691 
       
   692     def generateAppendMethod(cls, attr, attr_type):
       
   693         def appendMethod(self, value):
       
   694             getattr(self, attr).append(value)
       
   695         return appendMethod
       
   696 
       
   697     def generateInsertMethod(cls, attr, attr_type):
       
   698         def insertMethod(self, index, value):
       
   699             getattr(self, attr).insert(index, value)
       
   700         return insertMethod
       
   701 
       
   702     def generateAppendChoiceMethod(cls, choice_types):
       
   703         def appendMethod(self, name, value):
       
   704             self.content.append({"name":name,"value":value})
       
   705         return appendMethod
       
   706 
       
   707     def generateInsertChoiceMethod(cls, choice_types):
       
   708         def insertMethod(self, index, name, value):
       
   709             self.content.insert(index, {"name":name,"value":value})
       
   710         return insertMethod
       
   711 
       
   712     def generateRemoveMethod(cls, attr):
       
   713         def removeMethod(self, index):
       
   714             getattr(self, attr).pop(index)
       
   715         return removeMethod
       
   716 
       
   717     def generateCountMethod(cls, attr):
       
   718         def countMethod(self):
       
   719             return len(getattr(self, attr))
       
   720         return countMethod
       
   721 
       
   722 """
       
   723 Method that generate the classes
       
   724 """
       
   725 def CreateClass(classe):
       
   726     # Checks that classe haven't been generated yet
       
   727     if classe not in PLCOpenClasses and classe not in PLCOpenTypes and classe in classes:
       
   728         inheritance, attributes = classes[classe]
       
   729         #print classe, inheritance, attributes
       
   730         dict = {}
       
   731         bases = []
       
   732         
       
   733         # If inheritance classes haven't been generated
       
   734         for base in inheritance:
       
   735             if base not in PLCOpenClasses:
       
   736                 CreateClass(base)
       
   737             bases.append(PLCOpenClasses[base])
       
   738         
       
   739         # Checks that all attribute types are available 
       
   740         for attribute, type_attribute in attributes.items():
       
   741             if attribute == "group":
       
   742                 PLCOpenTypes[classe] = type_attribute
       
   743             elif attribute == "ref":
       
   744                 PLCOpenTypes[classe] = {}
       
   745                 for attr in type_attribute:
       
   746                     if attr[4:] not in PLCOpenTypes:
       
   747                         CreateClass(attr[4:])
       
   748                     PLCOpenTypes[classe].update(PLCOpenTypes[attr[4:]])
       
   749             elif attribute in ["choice_content","multichoice_content"]:
       
   750                 element_types = {}
       
   751                 for attr, value in type_attribute.items():
       
   752                     if attr == "ref":
       
   753                         for ref in type_attribute["ref"]:
       
   754                             if ref[4:] not in PLCOpenTypes:
       
   755                                 CreateClass(ref[4:])
       
   756                             element_types.update(PLCOpenTypes[ref[4:]])
       
   757                     else:
       
   758                         element_types[attr] = value
       
   759                 dict[attribute] = element_types
       
   760             else:
       
   761                 dict[attribute] = type_attribute
       
   762                 if attribute == "enum":
       
   763                     PLCOpenTypes["%s_enum"%classe] = type_attribute
       
   764                 elif attribute not in ["limit", "order"]:
       
   765                     if type_attribute[0].startswith("ppx:"):
       
   766                         type_compute = type_attribute[0][4:].replace("[]","")
       
   767                         if type_compute not in PLCOpenClasses:
       
   768                             CreateClass(type_compute)
       
   769         if "group" not in attributes.keys() and "ref" not in attributes.keys():
       
   770             cls = MetaClass.__new__(MetaClass, classe, tuple(bases), dict)
       
   771             MetaClass.__init__(cls, classe, tuple(bases), dict)
       
   772             PLCOpenClasses[classe] = cls
       
   773     
       
   774 def Generate_Methods():
       
   775     if "dataType" in PLCOpenClasses:
       
   776         cls = PLCOpenClasses["dataType"]
       
   777         cls.value = None
       
   778         
       
   779         def getValue(self):
       
   780             return self.value
       
   781         setattr(cls, "getValue", getValue)
       
   782         
       
   783         def setValue(self, value):
       
   784             self.value = value
       
   785         setattr(cls, "setValue", setValue)
       
   786         
       
   787         def loadXMLTree(self, tree):
       
   788             self.value = tree.childNodes[1].nodeName
       
   789         setattr(cls, "loadXMLTree", loadXMLTree)
       
   790         
       
   791         def generateXMLText(self, name, indent, extras = {}):
       
   792             ind1, ind2 = getIndent(indent, name)
       
   793             text = ind1 + "<%s>\n"%name
    96             text = ind1 + "<%s>\n"%name
   794             ind3, ind4 = getIndent(indent + 1, self.value)
    97             text += "%s\n"%self.text
   795             text += ind3 + "<%s/>\n"%self.value
       
   796             text += ind1 + "</%s>\n"%name
    98             text += ind1 + "</%s>\n"%name
   797             return text
    99             return text
   798         setattr(cls, "generateXMLText", generateXMLText)
   100         else:
   799     
   101             return ind1 + "<%s>%s</%s>\n"%(name, self.text, name)
   800     if "formattedText" in PLCOpenClasses:
   102     setattr(cls, "generateXMLText", generateXMLText)
   801         cls = PLCOpenClasses["formattedText"]
   103     
   802         cls.text = ""
   104 if "project" in PLCOpenClasses:
       
   105     cls = PLCOpenClasses["project"]
       
   106     cls.singleLineAttributes = False
       
   107     
       
   108     def getFileHeader(self):
       
   109         fileheader = {}
       
   110         fileheader["companyName"] = self.fileHeader.getCompanyName()
       
   111         if self.fileHeader.getCompanyURL():
       
   112             fileheader["companyURL"] = self.fileHeader.getCompanyURL()
       
   113         fileheader["productName"] = self.fileHeader.getProductName()
       
   114         fileheader["productVersion"] = self.fileHeader.getProductVersion()
       
   115         if self.fileHeader.getProductRelease():
       
   116             fileheader["productRelease"] = self.fileHeader.getProductRelease()
       
   117         fileheader["creationDateTime"] = self.fileHeader.getCreationDateTime()
       
   118         if self.fileHeader.getContentDescription():
       
   119             fileheader["contentDescription"] = self.fileHeader.getContentDescription()
       
   120         return fileheader
       
   121     setattr(cls, "getFileHeader", getFileHeader)
       
   122     
       
   123     def setFileHeader(self, fileheader):
       
   124         self.fileHeader.setCompanyName(fileheader["companyName"])
       
   125         if "companyURL" in fileheader:
       
   126             self.fileHeader.setCompanyURL(fileheader["companyURL"])
       
   127         self.fileHeader.setProductName(fileheader["productName"])
       
   128         self.fileHeader.setProductVersion(fileheader["productVersion"])
       
   129         if "productRelease" in fileheader:
       
   130             self.fileHeader.setProductRelease(fileheader["productRelease"])
       
   131         self.fileHeader.setCreationDateTime(fileheader["creationDateTime"])
       
   132         if "contentDescription" in fileheader:
       
   133             self.fileHeader.setContentDescription(fileheader["contentDescription"])
       
   134     setattr(cls, "setFileHeader", setFileHeader)
       
   135     
       
   136     def setName(self, name):
       
   137         self.contentHeader.setName(name)
       
   138     setattr(cls, "setName", setName)
   803         
   139         
   804         def getText(self):
   140     def getName(self):
   805             return self.text
   141         return self.contentHeader.getName()
   806         setattr(cls, "getText", getText)
   142     setattr(cls, "getName", getName)
       
   143     
       
   144     def getPous(self):
       
   145         return self.types.getPouElements()
       
   146     setattr(cls, "getPous", getPous)
       
   147     
       
   148     def getPou(self, name):
       
   149         return self.types.getPouElement(name)
       
   150     setattr(cls, "getPou", getPou)
       
   151     
       
   152     def appendPou(self, name, pou_type, body_type):
       
   153         self.types.appendPouElement(name, pou_type, body_type)
       
   154     setattr(cls, "appendPou", appendPou)
   807         
   155         
   808         def setText(self, text):
   156     def insertPou(self, index, pou):
   809             self.text = text
   157         self.types.insertPouElement(index, pou)
   810         setattr(cls, "setText", setText)
   158     setattr(cls, "insertPou", insertPou)
   811         
   159     
   812         def loadXMLTree(self, tree):
   160     def removePou(self, name):
   813             self.text = GetAttributeValue(tree)
   161         self.types.removePouElement(name)
   814             if len(self.text.splitlines()) > 1:
   162     setattr(cls, "removePou", removePou)
   815                 self.text = self.text[1:].rstrip()
   163 
   816         setattr(cls, "loadXMLTree", loadXMLTree)
   164     def getConfigurations(self):
   817         
   165         configurations = self.instances.configurations.getConfiguration()
   818         def generateXMLText(self, name, indent, extras = {}):
   166         if configurations:
   819             ind1, ind2 = getIndent(indent, name)
   167             return configurations
   820             if len(self.text.splitlines()) > 1:
   168         return []
   821                 text = ind1 + "<%s>\n"%name
   169     setattr(cls, "getConfigurations", getConfigurations)
   822                 text += "%s\n"%self.text
   170 
   823                 text += ind1 + "</%s>\n"%name
   171     def getConfiguration(self, name):
   824                 return text
   172         for configuration in self.instances.configurations.getConfiguration():
   825             else:
   173             if configuration.getName() == name:
   826                 return ind1 + "<%s>%s</%s>\n"%(name, self.text, name)
   174                 return configuration
   827         setattr(cls, "generateXMLText", generateXMLText)
   175         return None
   828         
   176     setattr(cls, "getConfiguration", getConfiguration)
   829     if "project" in PLCOpenClasses:
   177 
   830         cls = PLCOpenClasses["project"]
   178     def addConfiguration(self, name):
   831         cls.singleLineAttributes = False
   179         for configuration in self.instances.configurations.getConfiguration():
   832         
   180             if configuration.getName() == name:
   833         def getFileHeader(self):
   181                 raise ValueError, "\"%s\" configuration already exists !!!"%name
   834             fileheader = {}
   182         new_configuration = PLCOpenClasses["configurations_configuration"]()
   835             fileheader["companyName"] = self.fileHeader.getCompanyName()
   183         new_configuration.setName(name)
   836             if self.fileHeader.getCompanyURL():
   184         self.instances.configurations.appendConfiguration(new_configuration)
   837                 fileheader["companyURL"] = self.fileHeader.getCompanyURL()
   185     setattr(cls, "addConfiguration", addConfiguration)    
   838             fileheader["productName"] = self.fileHeader.getProductName()
   186 
   839             fileheader["productVersion"] = self.fileHeader.getProductVersion()
   187     def removeConfiguration(self, name):
   840             if self.fileHeader.getProductRelease():
   188         found = False
   841                 fileheader["productRelease"] = self.fileHeader.getProductRelease()
   189         for idx, configuration in enumerate(self.instances.configurations.getConfiguration()):
   842             fileheader["creationDateTime"] = self.fileHeader.getCreationDateTime()
   190             if configuration.getName() == name:
   843             if self.fileHeader.getContentDescription():
   191                 self.instances.configurations.removeConfiguration(idx)
   844                 fileheader["contentDescription"] = self.fileHeader.getContentDescription()
   192                 found = True
   845             return fileheader
   193                 break
   846         setattr(cls, "getFileHeader", getFileHeader)
   194         if not found:
   847         
   195             raise ValueError, "\"%s\" configuration doesn't exist !!!"%name
   848         def setFileHeader(self, fileheader):
   196     setattr(cls, "removeConfiguration", removeConfiguration)
   849             self.fileHeader.setCompanyName(fileheader["companyName"])
   197 
   850             if "companyURL" in fileheader:
   198     def getConfigurationResource(self, config_name, name):
   851                 self.fileHeader.setCompanyURL(fileheader["companyURL"])
   199         configuration = self.getConfiguration(config_name)
   852             self.fileHeader.setProductName(fileheader["productName"])
   200         if configuration:
   853             self.fileHeader.setProductVersion(fileheader["productVersion"])
   201             for resource in configuration.getResource():
   854             if "productRelease" in fileheader:
   202                 if resource.getName() == name:
   855                 self.fileHeader.setProductRelease(fileheader["productRelease"])
   203                     return resource
   856             self.fileHeader.setCreationDateTime(fileheader["creationDateTime"])
   204         return None
   857             if "contentDescription" in fileheader:
   205     setattr(cls, "getConfigurationResource", getConfigurationResource)
   858                 self.fileHeader.setContentDescription(fileheader["contentDescription"])
   206 
   859         setattr(cls, "setFileHeader", setFileHeader)
   207     def addConfigurationResource(self, config_name, name):
   860         
   208         configuration = self.getConfiguration(config_name)
   861         def setName(self, name):
   209         if configuration:
   862             self.contentHeader.setName(name)
   210             for resource in configuration.getResource():
   863         setattr(cls, "setName", setName)
   211                 if resource.getName() == name:
   864             
   212                     raise ValueError, "\"%s\" resource already exists in \"%s\" configuration !!!"%(name, config_name)
   865         def getName(self):
   213             new_resource = PLCOpenClasses["configuration_resource"]()
   866             return self.contentHeader.getName()
   214             new_resource.setName(name)
   867         setattr(cls, "getName", getName)
   215             configuration.appendResource(new_resource)
   868         
   216     setattr(cls, "addConfigurationResource", addConfigurationResource)    
   869         def getPous(self):
   217 
   870             return self.types.getPouElements()
   218     def removeConfigurationResource(self, config_name, name):
   871         setattr(cls, "getPous", getPous)
   219         configuration = self.getConfiguration(config_name)
   872         
   220         if configuration:
   873         def getPou(self, name):
       
   874             return self.types.getPouElement(name)
       
   875         setattr(cls, "getPou", getPou)
       
   876         
       
   877         def appendPou(self, name, pou_type, body_type):
       
   878             self.types.appendPouElement(name, pou_type, body_type)
       
   879         setattr(cls, "appendPou", appendPou)
       
   880             
       
   881         def insertPou(self, index, pou):
       
   882             self.types.insertPouElement(index, pou)
       
   883         setattr(cls, "insertPou", insertPou)
       
   884         
       
   885         def removePou(self, name):
       
   886             self.types.removePouElement(name)
       
   887         setattr(cls, "removePou", removePou)
       
   888 
       
   889         def getConfigurations(self):
       
   890             configurations = self.instances.configurations.getConfiguration()
       
   891             if configurations:
       
   892                 return configurations
       
   893             return []
       
   894         setattr(cls, "getConfigurations", getConfigurations)
       
   895 
       
   896         def getConfiguration(self, name):
       
   897             for configuration in self.instances.configurations.getConfiguration():
       
   898                 if configuration.getName() == name:
       
   899                     return configuration
       
   900             return None
       
   901         setattr(cls, "getConfiguration", getConfiguration)
       
   902 
       
   903         def addConfiguration(self, name):
       
   904             for configuration in self.instances.configurations.getConfiguration():
       
   905                 if configuration.getName() == name:
       
   906                     raise ValueError, "\"%s\" configuration already exists !!!"%name
       
   907             new_configuration = PLCOpenClasses["configurations_configuration"]()
       
   908             new_configuration.setName(name)
       
   909             self.instances.configurations.appendConfiguration(new_configuration)
       
   910         setattr(cls, "addConfiguration", addConfiguration)    
       
   911 
       
   912         def removeConfiguration(self, name):
       
   913             found = False
   221             found = False
   914             for idx, configuration in enumerate(self.instances.configurations.getConfiguration()):
   222             for idx, resource in enumerate(configuration.getResource()):
   915                 if configuration.getName() == name:
   223                 if resource.getName() == name:
   916                     self.instances.configurations.removeConfiguration(idx)
   224                     configuration.removeResource(idx)
   917                     found = True
   225                     found = True
   918                     break
   226                     break
   919             if not found:
   227             if not found:
   920                 raise ValueError, "\"%s\" configuration doesn't exist !!!"%name
   228                 raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name)
   921         setattr(cls, "removeConfiguration", removeConfiguration)
   229     setattr(cls, "removeConfigurationResource", removeConfigurationResource)
   922 
   230 
   923         def getConfigurationResource(self, config_name, name):
   231 PLCOpenClasses["project_fileHeader"].singleLineAttributes = False
   924             configuration = self.getConfiguration(config_name)
   232 
   925             if configuration:
   233 if "project_types" in PLCOpenClasses:
   926                 for resource in configuration.getResource():
   234     cls = PLCOpenClasses["project_types"]
   927                     if resource.getName() == name:
   235 
   928                         return resource
   236     def getPouElements(self):
       
   237         return self.pous.getPou()
       
   238     setattr(cls, "getPouElements", getPouElements)
       
   239     
       
   240     def getPouElement(self, name):
       
   241         elements = self.pous.getPou()
       
   242         for element in elements:
       
   243             if element.getName() == name:
       
   244                 return element
       
   245         return None
       
   246     setattr(cls, "getPouElement", getPouElement)
       
   247 
       
   248     def appendPouElement(self, name, pou_type, body_type):
       
   249         for element in self.pous.getPou():
       
   250             if element.getName() == name:
       
   251                 raise ValueError, "\"%s\" POU already exists !!!"%name
       
   252         new_pou = PLCOpenClasses["pous_pou"]()
       
   253         new_pou.setName(name)
       
   254         new_pou.pouType.setValue(pou_type)
       
   255         new_pou.setBody(PLCOpenClasses["body"]())
       
   256         new_pou.setBodyType(body_type)
       
   257         self.pous.appendPou(new_pou)
       
   258     setattr(cls, "appendPouElement", appendPouElement)
       
   259         
       
   260     def insertPouElement(self, index, pou):
       
   261         self.pous.insertPou(index, pou)
       
   262     setattr(cls, "insertPouElement", insertPouElement)
       
   263     
       
   264     def removePouElement(self, name):
       
   265         found = False
       
   266         for idx, element in enumerate(self.pous.getPou()):
       
   267             if element.getName() == name:
       
   268                 self.pous.removePou(idx)
       
   269                 found = True
       
   270                 break
       
   271         if not found:
       
   272             raise ValueError, "\"%s\" POU doesn't exist !!!"%name
       
   273     setattr(cls, "removePouElement", removePouElement)
       
   274 
       
   275 def setBodyType(self, type):
       
   276     if type == "IL":
       
   277         self.body.setContent("IL", PLCOpenClasses["formattedText"]())
       
   278     elif type == "ST":
       
   279         self.body.setContent("ST", PLCOpenClasses["formattedText"]())
       
   280     elif type == "LD":
       
   281         self.body.setContent("LD", PLCOpenClasses["body_LD"]())
       
   282     elif type == "FBD":
       
   283         self.body.setContent("FBD", PLCOpenClasses["body_FBD"]())
       
   284     elif type == "SFC":
       
   285         self.body.setContent("SFC", PLCOpenClasses["body_SFC"]())
       
   286     else:
       
   287         raise ValueError, "%s isn't a valid body type!"%type
       
   288         
       
   289 def getBodyType(self):
       
   290     return self.body.getContent()["name"]
       
   291 
       
   292 def addInstance(self, name, instance):
       
   293     self.body.appendContentInstance(name, instance)
       
   294 
       
   295 def getInstances(self):
       
   296     return self.body.getContentInstances()
       
   297 
       
   298 def getInstance(self, id):
       
   299     return self.body.getContentInstance(id)
       
   300 
       
   301 def getRandomInstance(self, exclude):
       
   302     return self.body.getContentRandomInstance(exclude)
       
   303 
       
   304 def getInstanceByName(self, name):
       
   305     return self.body.getContentInstanceByName(name)
       
   306 
       
   307 def removeInstance(self, id):
       
   308     self.body.removeContentInstance(id)
       
   309 
       
   310 def setText(self, text):
       
   311     self.body.setText(text)
       
   312 
       
   313 def getText(self):
       
   314     return self.body.getText()
       
   315 setattr(cls, "getText", getText)
       
   316 
       
   317 if "pous_pou" in PLCOpenClasses:
       
   318     cls = PLCOpenClasses["pous_pou"]
       
   319 
       
   320     setattr(cls, "setBodyType", setBodyType)
       
   321     setattr(cls, "getBodyType", getBodyType)
       
   322     setattr(cls, "addInstance", addInstance)
       
   323     setattr(cls, "getInstances", getInstances)
       
   324     setattr(cls, "getInstance", getInstance)
       
   325     setattr(cls, "getRandomInstance", getRandomInstance)
       
   326     setattr(cls, "getInstanceByName", getInstanceByName)
       
   327     setattr(cls, "removeInstance", removeInstance)
       
   328     setattr(cls, "setText", setText)
       
   329     setattr(cls, "getText", getText)
       
   330 
       
   331     def getVars(self):
       
   332         vars = []
       
   333         reverse_types = {}
       
   334         for name, value in VarTypes.items():
       
   335             reverse_types[value] = name
       
   336         for varlist in self.interface.getContent():
       
   337             vars.append((reverse_types[varlist["name"]], varlist["value"]))
       
   338         return vars
       
   339     setattr(cls, "getVars", getVars)
       
   340     
       
   341     def setVars(self, vars):
       
   342         self.interface.setContent([])
       
   343         for vartype, varlist in vars:
       
   344             self.interface.appendContent(VarTypes[vartype], varlist)
       
   345     setattr(cls, "setVars", setVars)
       
   346     
       
   347     def addTransition(self, name, type):
       
   348         if not self.transitions:
       
   349             self.addTransitions()
       
   350             self.transitions.setTransition([])
       
   351         transition = PLCOpenClasses["transitions_transition"]()
       
   352         transition.setName(name)
       
   353         transition.setBodyType(type)
       
   354         self.transitions.appendTransition(transition)
       
   355     setattr(cls, "addTransition", addTransition)
       
   356     
       
   357     def getTransition(self, name):
       
   358         if self.transitions:
       
   359             for transition in self.transitions.getTransition():
       
   360                 if transition.getName() == name:
       
   361                     return transition
       
   362         return None
       
   363     setattr(cls, "getTransition", getTransition)
       
   364         
       
   365     def getTransitionList(self):
       
   366         if self.transitions:
       
   367             return self.transitions.getTransition()
       
   368         return []
       
   369     setattr(cls, "getTransitionList", getTransitionList)
       
   370     
       
   371     def removeTransition(self, name):
       
   372         if self.transitions:
       
   373             transitions = self.transitions.getTransition()
       
   374             i = 0
       
   375             removed = False
       
   376             while i < len(transitions) and not removed:
       
   377                 if transitions[i].getName() == name:
       
   378                     transitions.removeTransition(i)
       
   379                     removed = True
       
   380                 i += 1
       
   381             if not removed:
       
   382                 raise ValueError, "Transition with name %s doesn't exists!"%name
       
   383     setattr(cls, "removeTransition", removeTransition)
       
   384 
       
   385     def addAction(self, name, type):
       
   386         if not self.actions:
       
   387             self.addActions()
       
   388             self.actions.setAction([])
       
   389         action = PLCOpenClasses["actions_action"]()
       
   390         action.setName(name)
       
   391         action.setBodyType(type)
       
   392         self.actions.appendAction(action)
       
   393     setattr(cls, "addAction", addAction)
       
   394     
       
   395     def getAction(self, name):
       
   396         if self.actions:
       
   397             for action in self.actions.getAction():
       
   398                 if action.getName() == name:
       
   399                     return action
       
   400         return None
       
   401     setattr(cls, "getAction", getAction)
       
   402     
       
   403     def getActionList(self):
       
   404         if self.actions:
       
   405             return self.actions.getAction()
       
   406         return []
       
   407     setattr(cls, "getActionList", getActionList)
       
   408         
       
   409     def removeAction(self, name):
       
   410         if self.actions:
       
   411             actions = self.actions.getAction()
       
   412             i = 0
       
   413             removed = False
       
   414             while i < len(actions) and not removed:
       
   415                 if actions[i].getName() == name:
       
   416                     actions.removeAction(i)
       
   417                     removed = True
       
   418                 i += 1
       
   419             if not removed:
       
   420                 raise ValueError, "Action with name %s doesn't exists!"%name
       
   421     setattr(cls, "removeAction", removeAction)
       
   422 
       
   423 if "transitions_transition" in PLCOpenClasses:
       
   424     cls = PLCOpenClasses["transitions_transition"]
       
   425 
       
   426     setattr(cls, "setBodyType", setBodyType)
       
   427     setattr(cls, "getBodyType", getBodyType)
       
   428     setattr(cls, "addInstance", addInstance)
       
   429     setattr(cls, "getInstances", getInstances)
       
   430     setattr(cls, "getInstance", getInstance)
       
   431     setattr(cls, "getRandomInstance", getRandomInstance)
       
   432     setattr(cls, "getInstanceByName", getInstanceByName)
       
   433     setattr(cls, "removeInstance", removeInstance)
       
   434     setattr(cls, "setText", setText)
       
   435     setattr(cls, "getText", getText)
       
   436 
       
   437 if "actions_action" in PLCOpenClasses:
       
   438     cls = PLCOpenClasses["actions_action"]
       
   439 
       
   440     setattr(cls, "setBodyType", setBodyType)
       
   441     setattr(cls, "getBodyType", getBodyType)
       
   442     setattr(cls, "addInstance", addInstance)
       
   443     setattr(cls, "getInstances", getInstances)
       
   444     setattr(cls, "getInstance", getInstance)
       
   445     setattr(cls, "getRandomInstance", getRandomInstance)
       
   446     setattr(cls, "getInstanceByName", getInstanceByName)
       
   447     setattr(cls, "removeInstance", removeInstance)
       
   448     setattr(cls, "setText", setText)
       
   449     setattr(cls, "getText", getText)
       
   450 
       
   451 if "body" in PLCOpenClasses:
       
   452     cls = PLCOpenClasses["body"]
       
   453     
       
   454     def appendContentInstance(self, name, instance):
       
   455         if self.content["name"] in ["LD","FBD","SFC"]:
       
   456             self.content["value"].appendContent(name, instance)
       
   457         else:
       
   458             raise TypeError, "%s body don't have instances!"%self.content["name"]
       
   459     setattr(cls, "appendContentInstance", appendContentInstance)
       
   460     
       
   461     def getContentInstances(self):
       
   462         if self.content["name"] in ["LD","FBD","SFC"]:
       
   463             instances = []
       
   464             for element in self.content["value"].getContent():
       
   465                 instances.append(element["value"])
       
   466             return instances
       
   467         else:
       
   468             raise TypeError, "%s body don't have instances!"%self.content["name"]
       
   469     setattr(cls, "getContentInstances", getContentInstances)
       
   470 
       
   471     def getContentInstance(self, id):
       
   472         if self.content["name"] in ["LD","FBD","SFC"]:
       
   473             for element in self.content["value"].getContent():
       
   474                 if element["value"].getLocalId() == id:
       
   475                     return element["value"]
   929             return None
   476             return None
   930         setattr(cls, "getConfigurationResource", getConfigurationResource)
   477         else:
   931 
   478             raise TypeError, "%s body don't have instances!"%self.content["name"]
   932         def addConfigurationResource(self, config_name, name):
   479     setattr(cls, "getContentInstance", getContentInstance)
   933             configuration = self.getConfiguration(config_name)
   480     
   934             if configuration:
   481     def getContentRandomInstance(self, exclude):
   935                 for resource in configuration.getResource():
   482         if self.content["name"] in ["LD","FBD","SFC"]:
   936                     if resource.getName() == name:
   483             for element in self.content["value"].getContent():
   937                         raise ValueError, "\"%s\" resource already exists in \"%s\" configuration !!!"%(name, config_name)
   484                 if element["value"].getLocalId() not in exclude:
   938                 new_resource = PLCOpenClasses["configuration_resource"]()
   485                     return element["value"]
   939                 new_resource.setName(name)
   486             return None
   940                 configuration.appendResource(new_resource)
   487         else:
   941         setattr(cls, "addConfigurationResource", addConfigurationResource)    
   488             raise TypeError, "%s body don't have instances!"%self.content["name"]
   942 
   489     setattr(cls, "getContentRandomInstance", getContentRandomInstance)
   943         def removeConfigurationResource(self, config_name, name):
   490     
   944             configuration = self.getConfiguration(config_name)
   491     def getContentInstanceByName(self, name):
   945             if configuration:
   492         if self.content["name"] in ["LD","FBD","SFC"]:
   946                 found = False
   493             for element in self.content["value"].getContent():
   947                 for idx, resource in enumerate(configuration.getResource()):
   494                 if element["value"].getLocalId() == name:
   948                     if resource.getName() == name:
   495                     return element["value"]
   949                         configuration.removeResource(idx)
   496         else:
   950                         found = True
   497             raise TypeError, "%s body don't have instances!"%self.content["name"]
   951                         break
   498     setattr(cls, "getContentInstanceByName", getContentInstanceByName)
   952                 if not found:
   499     
   953                     raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name)
   500     def removeContentInstance(self, id):
   954         setattr(cls, "removeConfigurationResource", removeConfigurationResource)
   501         if self.content["name"] in ["LD","FBD","SFC"]:
   955 
   502             i = 0
   956     PLCOpenClasses["project_fileHeader"].singleLineAttributes = False
   503             removed = False
   957 
   504             elements = self.content["value"].getContent()
   958     if "project_types" in PLCOpenClasses:
   505             while i < len(elements) and not removed:
   959         cls = PLCOpenClasses["project_types"]
   506                 if elements[i]["value"].getLocalId() == id:
   960 
   507                     self.content["value"].removeContent(i)
   961         def getPouElements(self):
   508                     removed = True
   962             return self.pous.getPou()
   509                 i += 1
   963         setattr(cls, "getPouElements", getPouElements)
   510             if not removed:
       
   511                 raise ValueError, "Instance with id %d doesn't exists!"%id
       
   512         else:
       
   513             raise TypeError, "%s body don't have instances!"%self.content["name"]
       
   514     setattr(cls, "removeContentInstance", removeContentInstance)
       
   515     
       
   516     def setText(self, text):
       
   517         if self.content["name"] in ["IL","ST"]:
       
   518             self.content["value"].setText(text)
       
   519         else:
       
   520             raise TypeError, "%s body don't have text!"%self.content["name"]
       
   521     setattr(cls, "setText", setText)
       
   522 
       
   523     def getText(self):
       
   524         if self.content["name"] in ["IL","ST"]:
       
   525             return self.content["value"].getText()
       
   526         else:
       
   527             raise TypeError, "%s body don't have text!"%self.content["name"]
       
   528     setattr(cls, "getText", getText)
       
   529 
       
   530 def getX(self):
       
   531     return self.position.getX()
       
   532 
       
   533 def getY(self):
       
   534     return self.position.getY()
       
   535 
       
   536 def setX(self, x):
       
   537     self.position.setX(x)
       
   538     
       
   539 def setY(self, y):
       
   540     self.position.setY(y)
       
   541 
       
   542 if "comment" in PLCOpenClasses:
       
   543     cls = PLCOpenClasses["comment"]
       
   544     setattr(cls, "getX", getX)
       
   545     setattr(cls, "getY", getY)
       
   546     setattr(cls, "setX", setX)
       
   547     setattr(cls, "setY", setY)
       
   548 
       
   549     def setContentText(self, text):
       
   550         self.content.setText(text)
       
   551     setattr(cls, "setContentText", setContentText)
   964         
   552         
   965         def getPouElement(self, name):
   553     def getContentText(self):
   966             elements = self.pous.getPou()
   554         return self.content.getText()
   967             for element in elements:
   555     setattr(cls, "getContentText", getContentText)
   968                 if element.getName() == name:
   556 
   969                     return element
   557 if "block" in PLCOpenClasses:
   970             return None
   558     cls = PLCOpenClasses["block"]
   971         setattr(cls, "getPouElement", getPouElement)
   559     setattr(cls, "getX", getX)
   972 
   560     setattr(cls, "getY", getY)
   973         def appendPouElement(self, name, pou_type, body_type):
   561     setattr(cls, "setX", setX)
   974             for element in self.pous.getPou():
   562     setattr(cls, "setY", setY)
   975                 if element.getName() == name:
   563 
   976                     raise ValueError, "\"%s\" POU already exists !!!"%name
   564 if "inputVariables_variable" in PLCOpenClasses:
   977             new_pou = PLCOpenClasses["pous_pou"]()
   565     cls = PLCOpenClasses["inputVariables_variable"]
   978             new_pou.setName(name)
   566 
   979             new_pou.pouType.setValue(pou_type)
   567     def setConnectorEdge(self, edge):
   980             new_pou.setBody(PLCOpenClasses["body"]())
   568         if not self.edge:
   981             new_pou.setBodyType(body_type)
   569             self.edge = PLCOpenClasses["edgeModifierType"]()
   982             self.pous.appendPou(new_pou)
   570         self.edge.setValue(edge)
   983         setattr(cls, "appendPouElement", appendPouElement)
   571     setattr(cls, "setConnectorEdge", setConnectorEdge)
   984             
   572     
   985         def insertPouElement(self, index, pou):
   573     def getConnectorEdge(self):
   986             self.pous.insertPou(index, pou)
   574         if self.edge:
   987         setattr(cls, "insertPouElement", insertPouElement)
   575             return self.edge.getValue()
       
   576         return None
       
   577     setattr(cls, "getConnectorEdge", getConnectorEdge)
       
   578 
       
   579 if "outputVariables_variable" in PLCOpenClasses:
       
   580     cls = PLCOpenClasses["outputVariables_variable"]
       
   581     
       
   582     def setConnectorEdge(self, edge):
       
   583         if not self.edge:
       
   584             self.edge = PLCOpenClasses["edgeModifierType"]()
       
   585         self.edge.setValue(edge)
       
   586     setattr(cls, "setConnectorEdge", setConnectorEdge)
       
   587     
       
   588     def getConnectorEdge(self):
       
   589         if self.edge:
       
   590             return self.edge.getValue()
       
   591         return None
       
   592     setattr(cls, "getConnectorEdge", getConnectorEdge)
       
   593 
       
   594 if "leftPowerRail" in PLCOpenClasses:
       
   595     cls = PLCOpenClasses["leftPowerRail"]
       
   596     setattr(cls, "getX", getX)
       
   597     setattr(cls, "getY", getY)
       
   598     setattr(cls, "setX", setX)
       
   599     setattr(cls, "setY", setY)
       
   600 
       
   601 if "contact" in PLCOpenClasses:
       
   602     cls = PLCOpenClasses["contact"]
       
   603     setattr(cls, "getX", getX)
       
   604     setattr(cls, "getY", getY)
       
   605     setattr(cls, "setX", setX)
       
   606     setattr(cls, "setY", setY)
       
   607 
       
   608     def setContactEdge(self, edge):
       
   609         if not self.edge:
       
   610             self.edge = PLCOpenClasses["edgeModifierType"]()
       
   611         self.edge.setValue(edge)
       
   612     setattr(cls, "setContactEdge", setContactEdge)
       
   613     
       
   614     def getContactEdge(self):
       
   615         if self.edge:
       
   616             return self.edge.getValue()
       
   617         return None
       
   618     setattr(cls, "getContactEdge", getContactEdge)
       
   619 
       
   620 if "coil" in PLCOpenClasses:
       
   621     cls = PLCOpenClasses["coil"]
       
   622     setattr(cls, "getX", getX)
       
   623     setattr(cls, "getY", getY)
       
   624     setattr(cls, "setX", setX)
       
   625     setattr(cls, "setY", setY)
       
   626     
       
   627     def setCoilStorage(self, edge):
       
   628         if not self.storage:
       
   629             self.storage = PLCOpenClasses["storageModifierType"]()
       
   630         self.storage.setValue(edge)
       
   631     setattr(cls, "setCoilStorage", setCoilStorage)
       
   632     
       
   633     def getCoilStorage(self):
       
   634         if self.storage:
       
   635             return self.storage.getValue()
       
   636         return None
       
   637     setattr(cls, "getCoilStorage", getCoilStorage)
       
   638 
       
   639 if "rightPowerRail" in PLCOpenClasses:
       
   640     cls = PLCOpenClasses["rightPowerRail"]
       
   641     setattr(cls, "getX", getX)
       
   642     setattr(cls, "getY", getY)
       
   643     setattr(cls, "setX", setX)
       
   644     setattr(cls, "setY", setY)
       
   645 
       
   646 if "step" in PLCOpenClasses:
       
   647     cls = PLCOpenClasses["step"]
       
   648     setattr(cls, "getX", getX)
       
   649     setattr(cls, "getY", getY)
       
   650     setattr(cls, "setX", setX)
       
   651     setattr(cls, "setY", setY)
       
   652 
       
   653 if "transition" in PLCOpenClasses:
       
   654     cls = PLCOpenClasses["transition"]
       
   655     setattr(cls, "getX", getX)
       
   656     setattr(cls, "getY", getY)
       
   657     setattr(cls, "setX", setX)
       
   658     setattr(cls, "setY", setY)
       
   659 
       
   660     def setConditionContent(self, type, value):
       
   661         if not self.condition:
       
   662             self.addCondition()
       
   663         if type == "reference":
       
   664             condition = PLCOpenClasses["condition_reference"]()
       
   665             condition.setName(value)
       
   666         elif type == "inline":
       
   667             condition = PLCOpenClasses["condition_inline"]()
       
   668             condition.setContent("ST", PLCOpenClasses["formattedText"]())
       
   669             condition.setText(value)
       
   670         self.condition.setContent(type, condition)
       
   671     setattr(cls, "setConditionContent", setConditionContent)
   988         
   672         
   989         def removePouElement(self, name):
   673     def getConditionContent(self):
   990             found = False
   674         if self.condition:
   991             for idx, element in enumerate(self.pous.getPou()):
   675             content = self.condition.getContent()
   992                 if element.getName() == name:
   676             values = {"type" : content["name"]}
   993                     self.pous.removePou(idx)
   677             if values["type"] == "reference":
   994                     found = True
   678                 values["value"] = content["value"].getName()
   995                     break
   679             elif values["type"] == "inline":
   996             if not found:
   680                 values["value"] = content["value"].getText()
   997                 raise ValueError, "\"%s\" POU doesn't exist !!!"%name
   681             return values
   998         setattr(cls, "removePouElement", removePouElement)
   682         return ""
   999 
   683     setattr(cls, "getConditionContent", getConditionContent)
  1000     def setBodyType(self, type):
   684 
  1001         if type == "IL":
   685 if "selectionDivergence" in PLCOpenClasses:
  1002             self.body.setContent("IL", PLCOpenClasses["formattedText"]())
   686     cls = PLCOpenClasses["selectionDivergence"]
  1003         elif type == "ST":
   687     setattr(cls, "getX", getX)
  1004             self.body.setContent("ST", PLCOpenClasses["formattedText"]())
   688     setattr(cls, "getY", getY)
  1005         elif type == "LD":
   689     setattr(cls, "setX", setX)
  1006             self.body.setContent("LD", PLCOpenClasses["body_LD"]())
   690     setattr(cls, "setY", setY)
  1007         elif type == "FBD":
   691 
  1008             self.body.setContent("FBD", PLCOpenClasses["body_FBD"]())
   692 if "selectionConvergence" in PLCOpenClasses:
  1009         elif type == "SFC":
   693     cls = PLCOpenClasses["selectionConvergence"]
  1010             self.body.setContent("SFC", PLCOpenClasses["body_SFC"]())
   694     setattr(cls, "getX", getX)
  1011         else:
   695     setattr(cls, "getY", getY)
  1012             raise ValueError, "%s isn't a valid body type!"%type
   696     setattr(cls, "setX", setX)
  1013             
   697     setattr(cls, "setY", setY)
  1014     def getBodyType(self):
   698     
  1015         return self.body.getContent()["name"]
   699 if "simultaneousDivergence" in PLCOpenClasses:
  1016 
   700     cls = PLCOpenClasses["simultaneousDivergence"]
  1017     def addInstance(self, name, instance):
   701     setattr(cls, "getX", getX)
  1018         self.body.appendContentInstance(name, instance)
   702     setattr(cls, "getY", getY)
  1019     
   703     setattr(cls, "setX", setX)
  1020     def getInstances(self):
   704     setattr(cls, "setY", setY)
  1021         return self.body.getContentInstances()
   705     
  1022     
   706 if "simultaneousDivergence" in PLCOpenClasses:
  1023     def getInstance(self, id):
   707     cls = PLCOpenClasses["simultaneousConvergence"]
  1024         return self.body.getContentInstance(id)
   708     setattr(cls, "getX", getX)
  1025     
   709     setattr(cls, "getY", getY)
  1026     def getRandomInstance(self, exclude):
   710     setattr(cls, "setX", setX)
  1027         return self.body.getContentRandomInstance(exclude)
   711     setattr(cls, "setY", setY)
  1028     
   712 
  1029     def getInstanceByName(self, name):
   713 if "jumpStep" in PLCOpenClasses:
  1030         return self.body.getContentInstanceByName(name)
   714     cls = PLCOpenClasses["jumpStep"]
  1031     
   715     setattr(cls, "getX", getX)
  1032     def removeInstance(self, id):
   716     setattr(cls, "getY", getY)
  1033         self.body.removeContentInstance(id)
   717     setattr(cls, "setX", setX)
  1034     
   718     setattr(cls, "setY", setY)
  1035     def setText(self, text):
   719 
  1036         self.body.setText(text)
   720 if "actionBlock_action" in PLCOpenClasses:
  1037     
   721     cls = PLCOpenClasses["actionBlock_action"]
  1038     def getText(self):
   722     
  1039         return self.body.getText()
   723     def setQualifierValue(self, value):
  1040     setattr(cls, "getText", getText)
   724         if self.qualifier:
  1041 
   725             self.qualifier.setValue(value)
  1042     if "pous_pou" in PLCOpenClasses:
   726     setattr(cls, "setQualifierValue", setQualifierValue)
  1043         cls = PLCOpenClasses["pous_pou"]
   727     
  1044 
   728     def getQualifierValue(self):
  1045         setattr(cls, "setBodyType", setBodyType)
   729         if self.qualifier:
  1046         setattr(cls, "getBodyType", getBodyType)
   730             return self.qualifier.getValue()
  1047         setattr(cls, "addInstance", addInstance)
   731         return None
  1048         setattr(cls, "getInstances", getInstances)
   732     setattr(cls, "getQualifierValue", getQualifierValue)
  1049         setattr(cls, "getInstance", getInstance)
   733 
  1050         setattr(cls, "getRandomInstance", getRandomInstance)
   734     def setReferenceName(self, name):
  1051         setattr(cls, "getInstanceByName", getInstanceByName)
   735         if self.reference:
  1052         setattr(cls, "removeInstance", removeInstance)
   736             self.reference.setName(name)
  1053         setattr(cls, "setText", setText)
   737     setattr(cls, "setReferenceName", setReferenceName)
  1054         setattr(cls, "getText", getText)
   738     
  1055 
   739     def getReferenceName(self):
  1056         def getVars(self):
   740         if self.reference:
  1057             vars = []
   741             return self.reference.getName()
  1058             reverse_types = {}
   742         return None
  1059             for name, value in VarTypes.items():
   743     setattr(cls, "getReferenceName", getReferenceName)
  1060                 reverse_types[value] = name
   744 
  1061             for varlist in self.interface.getContent():
   745     def setInlineContent(self, content):
  1062                 vars.append((reverse_types[varlist["name"]], varlist["value"]))
   746         if self.inline:
  1063             return vars
   747             self.inline.setContent("ST", PLCOpenClasses["formattedText"]())
  1064         setattr(cls, "getVars", getVars)
   748             self.inline.setText(content)
  1065         
   749     setattr(cls, "setInlineContent", setInlineContent)
  1066         def setVars(self, vars):
   750     
  1067             self.interface.setContent([])
   751     def getInlineContent(self):
  1068             for vartype, varlist in vars:
   752         if self.inline:
  1069                 self.interface.appendContent(VarTypes[vartype], varlist)
   753             return self.inline.getText()
  1070         setattr(cls, "setVars", setVars)
   754         return None
  1071         
   755     setattr(cls, "getInlineContent", getInlineContent)
  1072         def addTransition(self, name, type):
   756 
  1073             if not self.transitions:
   757 if "actionBlock" in PLCOpenClasses:
  1074                 self.addTransitions()
   758     cls = PLCOpenClasses["actionBlock"]
  1075                 self.transitions.setTransition([])
   759     setattr(cls, "getX", getX)
  1076             transition = PLCOpenClasses["transitions_transition"]()
   760     setattr(cls, "getY", getY)
  1077             transition.setName(name)
   761     setattr(cls, "setX", setX)
  1078             transition.setBodyType(type)
   762     setattr(cls, "setY", setY)
  1079             self.transitions.appendTransition(transition)
   763 
  1080         setattr(cls, "addTransition", addTransition)
   764     def setActions(self, actions):
  1081         
   765         self.action = []
  1082         def getTransition(self, name):
   766         for params in actions:
  1083             if self.transitions:
   767             action = PLCOpenClasses["actionBlock_action"]()
  1084                 for transition in self.transitions.getTransition():
   768             action.addQualifier()
  1085                     if transition.getName() == name:
   769             action.setQualifierValue(params["qualifier"])
  1086                         return transition
   770             if params["type"] == "reference":
  1087             return None
   771                 action.addReference()
  1088         setattr(cls, "getTransition", getTransition)
   772                 action.setReferenceName(params["value"])
  1089             
       
  1090         def getTransitionList(self):
       
  1091             if self.transitions:
       
  1092                 return self.transitions.getTransition()
       
  1093             return []
       
  1094         setattr(cls, "getTransitionList", getTransitionList)
       
  1095         
       
  1096         def removeTransition(self, name):
       
  1097             if self.transitions:
       
  1098                 transitions = self.transitions.getTransition()
       
  1099                 i = 0
       
  1100                 removed = False
       
  1101                 while i < len(transitions) and not removed:
       
  1102                     if transitions[i].getName() == name:
       
  1103                         transitions.removeTransition(i)
       
  1104                         removed = True
       
  1105                     i += 1
       
  1106                 if not removed:
       
  1107                     raise ValueError, "Transition with name %s doesn't exists!"%name
       
  1108         setattr(cls, "removeTransition", removeTransition)
       
  1109 
       
  1110         def addAction(self, name, type):
       
  1111             if not self.actions:
       
  1112                 self.addActions()
       
  1113                 self.actions.setAction([])
       
  1114             action = PLCOpenClasses["actions_action"]()
       
  1115             action.setName(name)
       
  1116             action.setBodyType(type)
       
  1117             self.actions.appendAction(action)
       
  1118         setattr(cls, "addAction", addAction)
       
  1119         
       
  1120         def getAction(self, name):
       
  1121             if self.actions:
       
  1122                 for action in self.actions.getAction():
       
  1123                     if action.getName() == name:
       
  1124                         return action
       
  1125             return None
       
  1126         setattr(cls, "getAction", getAction)
       
  1127         
       
  1128         def getActionList(self):
       
  1129             if self.actions:
       
  1130                 return self.actions.getAction()
       
  1131             return []
       
  1132         setattr(cls, "getActionList", getActionList)
       
  1133             
       
  1134         def removeAction(self, name):
       
  1135             if self.actions:
       
  1136                 actions = self.actions.getAction()
       
  1137                 i = 0
       
  1138                 removed = False
       
  1139                 while i < len(actions) and not removed:
       
  1140                     if actions[i].getName() == name:
       
  1141                         actions.removeAction(i)
       
  1142                         removed = True
       
  1143                     i += 1
       
  1144                 if not removed:
       
  1145                     raise ValueError, "Action with name %s doesn't exists!"%name
       
  1146         setattr(cls, "removeAction", removeAction)
       
  1147 
       
  1148     if "transitions_transition" in PLCOpenClasses:
       
  1149         cls = PLCOpenClasses["transitions_transition"]
       
  1150 
       
  1151         setattr(cls, "setBodyType", setBodyType)
       
  1152         setattr(cls, "getBodyType", getBodyType)
       
  1153         setattr(cls, "addInstance", addInstance)
       
  1154         setattr(cls, "getInstances", getInstances)
       
  1155         setattr(cls, "getInstance", getInstance)
       
  1156         setattr(cls, "getRandomInstance", getRandomInstance)
       
  1157         setattr(cls, "getInstanceByName", getInstanceByName)
       
  1158         setattr(cls, "removeInstance", removeInstance)
       
  1159         setattr(cls, "setText", setText)
       
  1160         setattr(cls, "getText", getText)
       
  1161 
       
  1162     if "actions_action" in PLCOpenClasses:
       
  1163         cls = PLCOpenClasses["actions_action"]
       
  1164 
       
  1165         setattr(cls, "setBodyType", setBodyType)
       
  1166         setattr(cls, "getBodyType", getBodyType)
       
  1167         setattr(cls, "addInstance", addInstance)
       
  1168         setattr(cls, "getInstances", getInstances)
       
  1169         setattr(cls, "getInstance", getInstance)
       
  1170         setattr(cls, "getRandomInstance", getRandomInstance)
       
  1171         setattr(cls, "getInstanceByName", getInstanceByName)
       
  1172         setattr(cls, "removeInstance", removeInstance)
       
  1173         setattr(cls, "setText", setText)
       
  1174         setattr(cls, "getText", getText)
       
  1175 
       
  1176     if "body" in PLCOpenClasses:
       
  1177         cls = PLCOpenClasses["body"]
       
  1178         
       
  1179         def appendContentInstance(self, name, instance):
       
  1180             if self.content["name"] in ["LD","FBD","SFC"]:
       
  1181                 self.content["value"].appendContent(name, instance)
       
  1182             else:
   773             else:
  1183                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   774                 action.addInline()
  1184         setattr(cls, "appendContentInstance", appendContentInstance)
   775                 action.setInlineContent(params["value"])
  1185         
   776             if "duration" in params:
  1186         def getContentInstances(self):
   777                 action.setDuration(params["duration"])
  1187             if self.content["name"] in ["LD","FBD","SFC"]:
   778             if "indicator" in params:
  1188                 instances = []
   779                 action.setIndicator(params["indicator"])
  1189                 for element in self.content["value"].getContent():
   780             self.action.append(action)
  1190                     instances.append(element["value"])
   781     setattr(cls, "setActions", setActions)
  1191                 return instances
   782 
  1192             else:
   783     def getActions(self):
  1193                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   784         actions = []
  1194         setattr(cls, "getContentInstances", getContentInstances)
   785         for action in self.action:
  1195     
   786             params = {}
  1196         def getContentInstance(self, id):
   787             params["qualifier"] = action.getQualifierValue()
  1197             if self.content["name"] in ["LD","FBD","SFC"]:
   788             if action.getReference():
  1198                 for element in self.content["value"].getContent():
   789                 params["type"] = "reference"
  1199                     if element["value"].getLocalId() == id:
   790                 params["value"] = action.getReferenceName()
  1200                         return element["value"]
   791             elif action.getInline():
  1201                 return None
   792                 params["type"] = "inline"
  1202             else:
   793                 params["value"] = action.getInlineContent()
  1203                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   794             duration = action.getDuration()
  1204         setattr(cls, "getContentInstance", getContentInstance)
   795             if duration:
  1205         
   796                 params["duration"] = duration
  1206         def getContentRandomInstance(self, exclude):
   797             indicator = action.getIndicator()
  1207             if self.content["name"] in ["LD","FBD","SFC"]:
   798             if indicator:
  1208                 for element in self.content["value"].getContent():
   799                 params["indicator"] = indicator
  1209                     if element["value"].getLocalId() not in exclude:
   800             actions.append(params)
  1210                         return element["value"]
   801         return actions
  1211                 return None
   802     setattr(cls, "getActions", getActions)
  1212             else:
   803 
  1213                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   804 if "inVariable" in PLCOpenClasses:
  1214         setattr(cls, "getContentRandomInstance", getContentRandomInstance)
   805     cls = PLCOpenClasses["inVariable"]
  1215         
   806     setattr(cls, "getX", getX)
  1216         def getContentInstanceByName(self, name):
   807     setattr(cls, "getY", getY)
  1217             if self.content["name"] in ["LD","FBD","SFC"]:
   808     setattr(cls, "setX", setX)
  1218                 for element in self.content["value"].getContent():
   809     setattr(cls, "setY", setY)
  1219                     if element["value"].getLocalId() == name:
   810 
  1220                         return element["value"]
   811     def setConnectorEdge(self, edge):
  1221             else:
   812         if not self.edge:
  1222                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   813             self.edge = PLCOpenClasses["edgeModifierType"]()
  1223         setattr(cls, "getContentInstanceByName", getContentInstanceByName)
   814         self.edge.setValue(edge)
  1224         
   815     setattr(cls, "setConnectorEdge", setConnectorEdge)
  1225         def removeContentInstance(self, id):
   816     
  1226             if self.content["name"] in ["LD","FBD","SFC"]:
   817     def getConnectorEdge(self):
  1227                 i = 0
   818         if self.edge:
  1228                 removed = False
   819             return self.edge.getValue()
  1229                 elements = self.content["value"].getContent()
   820         return None
  1230                 while i < len(elements) and not removed:
   821     setattr(cls, "getConnectorEdge", getConnectorEdge)
  1231                     if elements[i]["value"].getLocalId() == id:
   822 
  1232                         self.content["value"].removeContent(i)
   823 if "outVariable" in PLCOpenClasses:
  1233                         removed = True
   824     cls = PLCOpenClasses["outVariable"]
  1234                     i += 1
   825     setattr(cls, "getX", getX)
  1235                 if not removed:
   826     setattr(cls, "getY", getY)
  1236                     raise ValueError, "Instance with id %d doesn't exists!"%id
   827     setattr(cls, "setX", setX)
  1237             else:
   828     setattr(cls, "setY", setY)
  1238                 raise TypeError, "%s body don't have instances!"%self.content["name"]
   829 
  1239         setattr(cls, "removeContentInstance", removeContentInstance)
   830     def setConnectorEdge(self, edge):
  1240         
   831         if not self.edge:
  1241         def setText(self, text):
   832             self.edge = PLCOpenClasses["edgeModifierType"]()
  1242             if self.content["name"] in ["IL","ST"]:
   833         self.edge.setValue(edge)
  1243                 self.content["value"].setText(text)
   834     setattr(cls, "setConnectorEdge", setConnectorEdge)
  1244             else:
   835     
  1245                 raise TypeError, "%s body don't have text!"%self.content["name"]
   836     def getConnectorEdge(self):
  1246         setattr(cls, "setText", setText)
   837         if self.edge:
  1247 
   838             return self.edge.getValue()
  1248         def getText(self):
   839         return None
  1249             if self.content["name"] in ["IL","ST"]:
   840     setattr(cls, "getConnectorEdge", getConnectorEdge)
  1250                 return self.content["value"].getText()
   841 
  1251             else:
   842 if "inOutVariable" in PLCOpenClasses:
  1252                 raise TypeError, "%s body don't have text!"%self.content["name"]
   843     cls = PLCOpenClasses["inOutVariable"]
  1253         setattr(cls, "getText", getText)
   844     setattr(cls, "getX", getX)
  1254 
   845     setattr(cls, "getY", getY)
  1255     def getX(self):
   846     setattr(cls, "setX", setX)
  1256         return self.position.getX()
   847     setattr(cls, "setY", setY)
  1257     
   848 
  1258     def getY(self):
   849     def setInputEdge(self, edge):
  1259         return self.position.getY()
   850         if not self.edgeIn:
  1260     
   851             self.edgeIn = PLCOpenClasses["edgeModifierType"]()
  1261     def setX(self, x):
   852         self.edgeIn.setValue(edge)
  1262         self.position.setX(x)
   853     setattr(cls, "setInputEdge", setInputEdge)
  1263         
   854     
  1264     def setY(self, y):
   855     def getInputEdge(self):
  1265         self.position.setY(y)
   856         if self.edgeIn:
  1266     
   857             return self.edgeIn.getValue()
  1267     if "comment" in PLCOpenClasses:
   858         return None
  1268         cls = PLCOpenClasses["comment"]
   859     setattr(cls, "getInputEdge", getInputEdge)
  1269         setattr(cls, "getX", getX)
   860 
  1270         setattr(cls, "getY", getY)
   861     def setOutputEdge(self, edge):
  1271         setattr(cls, "setX", setX)
   862         if not self.edgeOut:
  1272         setattr(cls, "setY", setY)
   863             self.edgeOut = PLCOpenClasses["edgeModifierType"]()
  1273     
   864         self.edgeOut.setValue(edge)
  1274         def setContentText(self, text):
   865     setattr(cls, "setInputEdge", setInputEdge)
  1275             self.content.setText(text)
   866     
  1276         setattr(cls, "setContentText", setContentText)
   867     def getOutputEdge(self):
  1277             
   868         if self.edgeOut:
  1278         def getContentText(self):
   869             return self.edgeOut.getValue()
  1279             return self.content.getText()
   870         return None
  1280         setattr(cls, "getContentText", getContentText)
   871     setattr(cls, "getOutputEdge", getOutputEdge)
  1281     
   872 
  1282     if "block" in PLCOpenClasses:
   873 if "continuation" in PLCOpenClasses:
  1283         cls = PLCOpenClasses["block"]
   874     cls = PLCOpenClasses["continuation"]
  1284         setattr(cls, "getX", getX)
   875     setattr(cls, "getX", getX)
  1285         setattr(cls, "getY", getY)
   876     setattr(cls, "getY", getY)
  1286         setattr(cls, "setX", setX)
   877     setattr(cls, "setX", setX)
  1287         setattr(cls, "setY", setY)
   878     setattr(cls, "setY", setY)
  1288     
   879 
  1289     if "inputVariables_variable" in PLCOpenClasses:
   880 if "connector" in PLCOpenClasses:
  1290         cls = PLCOpenClasses["inputVariables_variable"]
   881     cls = PLCOpenClasses["connector"]
  1291 
   882     setattr(cls, "getX", getX)
  1292         def setConnectorEdge(self, edge):
   883     setattr(cls, "getY", getY)
  1293             if not self.edge:
   884     setattr(cls, "setX", setX)
  1294                 self.edge = PLCOpenClasses["edgeModifierType"]()
   885     setattr(cls, "setY", setY)
  1295             self.edge.setValue(edge)
   886 
  1296         setattr(cls, "setConnectorEdge", setConnectorEdge)
   887 if "connection" in PLCOpenClasses:
  1297         
   888     cls = PLCOpenClasses["connection"]
  1298         def getConnectorEdge(self):
   889     
  1299             if self.edge:
   890     def setPoints(self, points):
  1300                 return self.edge.getValue()
   891         self.position = []
  1301             return None
   892         for point in points:
  1302         setattr(cls, "getConnectorEdge", getConnectorEdge)
   893             position = PLCOpenClasses["position"]()
  1303     
   894             position.setX(point.x)
  1304     if "outputVariables_variable" in PLCOpenClasses:
   895             position.setY(point.y)
  1305         cls = PLCOpenClasses["outputVariables_variable"]
   896             self.position.append(position)
  1306         
   897     setattr(cls, "setPoints", setPoints)
  1307         def setConnectorEdge(self, edge):
   898 
  1308             if not self.edge:
   899     def getPoints(self):
  1309                 self.edge = PLCOpenClasses["edgeModifierType"]()
   900         points = []
  1310             self.edge.setValue(edge)
   901         for position in self.position:
  1311         setattr(cls, "setConnectorEdge", setConnectorEdge)
   902             points.append((position.getX(),position.getY()))
  1312         
   903         return points
  1313         def getConnectorEdge(self):
   904     setattr(cls, "getPoints", getPoints)
  1314             if self.edge:
   905 
  1315                 return self.edge.getValue()
   906 if "connectionPointIn" in PLCOpenClasses:
  1316             return None
   907     cls = PLCOpenClasses["connectionPointIn"]
  1317         setattr(cls, "getConnectorEdge", getConnectorEdge)
   908 
  1318     
   909     def setRelPosition(self, x, y):
  1319     if "leftPowerRail" in PLCOpenClasses:
   910         self.relPosition = PLCOpenClasses["position"]()
  1320         cls = PLCOpenClasses["leftPowerRail"]
   911         self.relPosition.setX(x)
  1321         setattr(cls, "getX", getX)
   912         self.relPosition.setY(y)
  1322         setattr(cls, "getY", getY)
   913     setattr(cls, "setRelPosition", setRelPosition)
  1323         setattr(cls, "setX", setX)
   914 
  1324         setattr(cls, "setY", setY)
   915     def getRelPosition(self):
  1325     
   916         if self.relPosition:
  1326     if "contact" in PLCOpenClasses:
   917             return self.relPosition.getX(), self.relPosition.getY()
  1327         cls = PLCOpenClasses["contact"]
   918         else:
  1328         setattr(cls, "getX", getX)
       
  1329         setattr(cls, "getY", getY)
       
  1330         setattr(cls, "setX", setX)
       
  1331         setattr(cls, "setY", setY)
       
  1332     
       
  1333         def setContactEdge(self, edge):
       
  1334             if not self.edge:
       
  1335                 self.edge = PLCOpenClasses["edgeModifierType"]()
       
  1336             self.edge.setValue(edge)
       
  1337         setattr(cls, "setContactEdge", setContactEdge)
       
  1338         
       
  1339         def getContactEdge(self):
       
  1340             if self.edge:
       
  1341                 return self.edge.getValue()
       
  1342             return None
       
  1343         setattr(cls, "getContactEdge", getContactEdge)
       
  1344     
       
  1345     if "coil" in PLCOpenClasses:
       
  1346         cls = PLCOpenClasses["coil"]
       
  1347         setattr(cls, "getX", getX)
       
  1348         setattr(cls, "getY", getY)
       
  1349         setattr(cls, "setX", setX)
       
  1350         setattr(cls, "setY", setY)
       
  1351         
       
  1352         def setCoilStorage(self, edge):
       
  1353             if not self.storage:
       
  1354                 self.storage = PLCOpenClasses["storageModifierType"]()
       
  1355             self.storage.setValue(edge)
       
  1356         setattr(cls, "setCoilStorage", setCoilStorage)
       
  1357         
       
  1358         def getCoilStorage(self):
       
  1359             if self.storage:
       
  1360                 return self.storage.getValue()
       
  1361             return None
       
  1362         setattr(cls, "getCoilStorage", getCoilStorage)
       
  1363     
       
  1364     if "rightPowerRail" in PLCOpenClasses:
       
  1365         cls = PLCOpenClasses["rightPowerRail"]
       
  1366         setattr(cls, "getX", getX)
       
  1367         setattr(cls, "getY", getY)
       
  1368         setattr(cls, "setX", setX)
       
  1369         setattr(cls, "setY", setY)
       
  1370     
       
  1371     if "step" in PLCOpenClasses:
       
  1372         cls = PLCOpenClasses["step"]
       
  1373         setattr(cls, "getX", getX)
       
  1374         setattr(cls, "getY", getY)
       
  1375         setattr(cls, "setX", setX)
       
  1376         setattr(cls, "setY", setY)
       
  1377     
       
  1378     if "transition" in PLCOpenClasses:
       
  1379         cls = PLCOpenClasses["transition"]
       
  1380         setattr(cls, "getX", getX)
       
  1381         setattr(cls, "getY", getY)
       
  1382         setattr(cls, "setX", setX)
       
  1383         setattr(cls, "setY", setY)
       
  1384     
       
  1385         def setConditionContent(self, type, value):
       
  1386             if not self.condition:
       
  1387                 self.addCondition()
       
  1388             if type == "reference":
       
  1389                 condition = PLCOpenClasses["condition_reference"]()
       
  1390                 condition.setName(value)
       
  1391             elif type == "inline":
       
  1392                 condition = PLCOpenClasses["condition_inline"]()
       
  1393                 condition.setContent("ST", PLCOpenClasses["formattedText"]())
       
  1394                 condition.setText(value)
       
  1395             self.condition.setContent(type, condition)
       
  1396         setattr(cls, "setConditionContent", setConditionContent)
       
  1397             
       
  1398         def getConditionContent(self):
       
  1399             if self.condition:
       
  1400                 content = self.condition.getContent()
       
  1401                 values = {"type" : content["name"]}
       
  1402                 if values["type"] == "reference":
       
  1403                     values["value"] = content["value"].getName()
       
  1404                 elif values["type"] == "inline":
       
  1405                     values["value"] = content["value"].getText()
       
  1406                 return values
       
  1407             return ""
       
  1408         setattr(cls, "getConditionContent", getConditionContent)
       
  1409     
       
  1410     if "selectionDivergence" in PLCOpenClasses:
       
  1411         cls = PLCOpenClasses["selectionDivergence"]
       
  1412         setattr(cls, "getX", getX)
       
  1413         setattr(cls, "getY", getY)
       
  1414         setattr(cls, "setX", setX)
       
  1415         setattr(cls, "setY", setY)
       
  1416 
       
  1417     if "selectionConvergence" in PLCOpenClasses:
       
  1418         cls = PLCOpenClasses["selectionConvergence"]
       
  1419         setattr(cls, "getX", getX)
       
  1420         setattr(cls, "getY", getY)
       
  1421         setattr(cls, "setX", setX)
       
  1422         setattr(cls, "setY", setY)
       
  1423         
       
  1424     if "simultaneousDivergence" in PLCOpenClasses:
       
  1425         cls = PLCOpenClasses["simultaneousDivergence"]
       
  1426         setattr(cls, "getX", getX)
       
  1427         setattr(cls, "getY", getY)
       
  1428         setattr(cls, "setX", setX)
       
  1429         setattr(cls, "setY", setY)
       
  1430         
       
  1431     if "simultaneousDivergence" in PLCOpenClasses:
       
  1432         cls = PLCOpenClasses["simultaneousConvergence"]
       
  1433         setattr(cls, "getX", getX)
       
  1434         setattr(cls, "getY", getY)
       
  1435         setattr(cls, "setX", setX)
       
  1436         setattr(cls, "setY", setY)
       
  1437 
       
  1438     if "jumpStep" in PLCOpenClasses:
       
  1439         cls = PLCOpenClasses["jumpStep"]
       
  1440         setattr(cls, "getX", getX)
       
  1441         setattr(cls, "getY", getY)
       
  1442         setattr(cls, "setX", setX)
       
  1443         setattr(cls, "setY", setY)
       
  1444 
       
  1445     if "actionBlock_action" in PLCOpenClasses:
       
  1446         cls = PLCOpenClasses["actionBlock_action"]
       
  1447         
       
  1448         def setQualifierValue(self, value):
       
  1449             if self.qualifier:
       
  1450                 self.qualifier.setValue(value)
       
  1451         setattr(cls, "setQualifierValue", setQualifierValue)
       
  1452         
       
  1453         def getQualifierValue(self):
       
  1454             if self.qualifier:
       
  1455                 return self.qualifier.getValue()
       
  1456             return None
       
  1457         setattr(cls, "getQualifierValue", getQualifierValue)
       
  1458 
       
  1459         def setReferenceName(self, name):
       
  1460             if self.reference:
       
  1461                 self.reference.setName(name)
       
  1462         setattr(cls, "setReferenceName", setReferenceName)
       
  1463         
       
  1464         def getReferenceName(self):
       
  1465             if self.reference:
       
  1466                 return self.reference.getName()
       
  1467             return None
       
  1468         setattr(cls, "getReferenceName", getReferenceName)
       
  1469 
       
  1470         def setInlineContent(self, content):
       
  1471             if self.inline:
       
  1472                 self.inline.setContent("ST", PLCOpenClasses["formattedText"]())
       
  1473                 self.inline.setText(content)
       
  1474         setattr(cls, "setInlineContent", setInlineContent)
       
  1475         
       
  1476         def getInlineContent(self):
       
  1477             if self.inline:
       
  1478                 return self.inline.getText()
       
  1479             return None
       
  1480         setattr(cls, "getInlineContent", getInlineContent)
       
  1481 
       
  1482     if "actionBlock" in PLCOpenClasses:
       
  1483         cls = PLCOpenClasses["actionBlock"]
       
  1484         setattr(cls, "getX", getX)
       
  1485         setattr(cls, "getY", getY)
       
  1486         setattr(cls, "setX", setX)
       
  1487         setattr(cls, "setY", setY)
       
  1488 
       
  1489         def setActions(self, actions):
       
  1490             self.action = []
       
  1491             for params in actions:
       
  1492                 action = PLCOpenClasses["actionBlock_action"]()
       
  1493                 action.addQualifier()
       
  1494                 action.setQualifierValue(params["qualifier"])
       
  1495                 if params["type"] == "reference":
       
  1496                     action.addReference()
       
  1497                     action.setReferenceName(params["value"])
       
  1498                 else:
       
  1499                     action.addInline()
       
  1500                     action.setInlineContent(params["value"])
       
  1501                 if "duration" in params:
       
  1502                     action.setDuration(params["duration"])
       
  1503                 if "indicator" in params:
       
  1504                     action.setIndicator(params["indicator"])
       
  1505                 self.action.append(action)
       
  1506         setattr(cls, "setActions", setActions)
       
  1507 
       
  1508         def getActions(self):
       
  1509             actions = []
       
  1510             for action in self.action:
       
  1511                 params = {}
       
  1512                 params["qualifier"] = action.getQualifierValue()
       
  1513                 if action.getReference():
       
  1514                     params["type"] = "reference"
       
  1515                     params["value"] = action.getReferenceName()
       
  1516                 elif action.getInline():
       
  1517                     params["type"] = "inline"
       
  1518                     params["value"] = action.getInlineContent()
       
  1519                 duration = action.getDuration()
       
  1520                 if duration:
       
  1521                     params["duration"] = duration
       
  1522                 indicator = action.getIndicator()
       
  1523                 if indicator:
       
  1524                     params["indicator"] = indicator
       
  1525                 actions.append(params)
       
  1526             return actions
       
  1527         setattr(cls, "getActions", getActions)
       
  1528 
       
  1529     if "inVariable" in PLCOpenClasses:
       
  1530         cls = PLCOpenClasses["inVariable"]
       
  1531         setattr(cls, "getX", getX)
       
  1532         setattr(cls, "getY", getY)
       
  1533         setattr(cls, "setX", setX)
       
  1534         setattr(cls, "setY", setY)
       
  1535 
       
  1536         def setConnectorEdge(self, edge):
       
  1537             if not self.edge:
       
  1538                 self.edge = PLCOpenClasses["edgeModifierType"]()
       
  1539             self.edge.setValue(edge)
       
  1540         setattr(cls, "setConnectorEdge", setConnectorEdge)
       
  1541         
       
  1542         def getConnectorEdge(self):
       
  1543             if self.edge:
       
  1544                 return self.edge.getValue()
       
  1545             return None
       
  1546         setattr(cls, "getConnectorEdge", getConnectorEdge)
       
  1547 
       
  1548     if "outVariable" in PLCOpenClasses:
       
  1549         cls = PLCOpenClasses["outVariable"]
       
  1550         setattr(cls, "getX", getX)
       
  1551         setattr(cls, "getY", getY)
       
  1552         setattr(cls, "setX", setX)
       
  1553         setattr(cls, "setY", setY)
       
  1554 
       
  1555         def setConnectorEdge(self, edge):
       
  1556             if not self.edge:
       
  1557                 self.edge = PLCOpenClasses["edgeModifierType"]()
       
  1558             self.edge.setValue(edge)
       
  1559         setattr(cls, "setConnectorEdge", setConnectorEdge)
       
  1560         
       
  1561         def getConnectorEdge(self):
       
  1562             if self.edge:
       
  1563                 return self.edge.getValue()
       
  1564             return None
       
  1565         setattr(cls, "getConnectorEdge", getConnectorEdge)
       
  1566 
       
  1567     if "inOutVariable" in PLCOpenClasses:
       
  1568         cls = PLCOpenClasses["inOutVariable"]
       
  1569         setattr(cls, "getX", getX)
       
  1570         setattr(cls, "getY", getY)
       
  1571         setattr(cls, "setX", setX)
       
  1572         setattr(cls, "setY", setY)
       
  1573 
       
  1574         def setInputEdge(self, edge):
       
  1575             if not self.edgeIn:
       
  1576                 self.edgeIn = PLCOpenClasses["edgeModifierType"]()
       
  1577             self.edgeIn.setValue(edge)
       
  1578         setattr(cls, "setInputEdge", setInputEdge)
       
  1579         
       
  1580         def getInputEdge(self):
       
  1581             if self.edgeIn:
       
  1582                 return self.edgeIn.getValue()
       
  1583             return None
       
  1584         setattr(cls, "getInputEdge", getInputEdge)
       
  1585 
       
  1586         def setOutputEdge(self, edge):
       
  1587             if not self.edgeOut:
       
  1588                 self.edgeOut = PLCOpenClasses["edgeModifierType"]()
       
  1589             self.edgeOut.setValue(edge)
       
  1590         setattr(cls, "setInputEdge", setInputEdge)
       
  1591         
       
  1592         def getOutputEdge(self):
       
  1593             if self.edgeOut:
       
  1594                 return self.edgeOut.getValue()
       
  1595             return None
       
  1596         setattr(cls, "getOutputEdge", getOutputEdge)
       
  1597 
       
  1598     if "continuation" in PLCOpenClasses:
       
  1599         cls = PLCOpenClasses["continuation"]
       
  1600         setattr(cls, "getX", getX)
       
  1601         setattr(cls, "getY", getY)
       
  1602         setattr(cls, "setX", setX)
       
  1603         setattr(cls, "setY", setY)
       
  1604 
       
  1605     if "connector" in PLCOpenClasses:
       
  1606         cls = PLCOpenClasses["connector"]
       
  1607         setattr(cls, "getX", getX)
       
  1608         setattr(cls, "getY", getY)
       
  1609         setattr(cls, "setX", setX)
       
  1610         setattr(cls, "setY", setY)
       
  1611 
       
  1612     if "connection" in PLCOpenClasses:
       
  1613         cls = PLCOpenClasses["connection"]
       
  1614         
       
  1615         def setPoints(self, points):
       
  1616             self.position = []
       
  1617             for point in points:
       
  1618                 position = PLCOpenClasses["position"]()
       
  1619                 position.setX(point.x)
       
  1620                 position.setY(point.y)
       
  1621                 self.position.append(position)
       
  1622         setattr(cls, "setPoints", setPoints)
       
  1623 
       
  1624         def getPoints(self):
       
  1625             points = []
       
  1626             for position in self.position:
       
  1627                 points.append((position.getX(),position.getY()))
       
  1628             return points
       
  1629         setattr(cls, "getPoints", getPoints)
       
  1630 
       
  1631     if "connectionPointIn" in PLCOpenClasses:
       
  1632         cls = PLCOpenClasses["connectionPointIn"]
       
  1633 
       
  1634         def setRelPosition(self, x, y):
       
  1635             self.relPosition = PLCOpenClasses["position"]()
       
  1636             self.relPosition.setX(x)
       
  1637             self.relPosition.setY(y)
       
  1638         setattr(cls, "setRelPosition", setRelPosition)
       
  1639 
       
  1640         def getRelPosition(self):
       
  1641             if self.relPosition:
       
  1642                 return self.relPosition.getX(), self.relPosition.getY()
       
  1643             else:
       
  1644                 return self.relPosition
       
  1645         setattr(cls, "getRelPosition", getRelPosition)
       
  1646 
       
  1647         def addConnection(self):
       
  1648             if not self.content:
       
  1649                 self.content = {"name":"connection","value":[PLCOpenClasses["connection"]()]}
       
  1650             else:
       
  1651                 self.content["value"].append(PLCOpenClasses["connection"]())
       
  1652         setattr(cls, "addConnection", addConnection)
       
  1653 
       
  1654         def removeConnection(self, idx):
       
  1655             if self.content:
       
  1656                 self.content["value"].pop(idx)
       
  1657             if len(self.content["value"]) == 0:
       
  1658                 self.content = None
       
  1659         setattr(cls, "removeConnection", removeConnection)
       
  1660 
       
  1661         def removeConnections(self):
       
  1662             if self.content:
       
  1663                 self.content = None
       
  1664         setattr(cls, "removeConnections", removeConnections)
       
  1665         
       
  1666         def getConnections(self):
       
  1667             if self.content:
       
  1668                 return self.content["value"]
       
  1669         setattr(cls, "getConnections", getConnections)
       
  1670         
       
  1671         def setConnectionId(self, idx, id):
       
  1672             if self.content:
       
  1673                 self.content["value"][idx].setRefLocalId(id)
       
  1674         setattr(cls, "setConnectionId", setConnectionId)
       
  1675         
       
  1676         def getConnectionId(self, idx):
       
  1677             if self.content:
       
  1678                 return self.content["value"][idx].getRefLocalId()
       
  1679             return None
       
  1680         setattr(cls, "getConnectionId", getConnectionId)
       
  1681         
       
  1682         def setConnectionPoints(self, idx, points):
       
  1683             if self.content:
       
  1684                 self.content["value"][idx].setPoints(points)
       
  1685         setattr(cls, "setConnectionPoints", setConnectionPoints)
       
  1686 
       
  1687         def getConnectionPoints(self, idx):
       
  1688             if self.content:
       
  1689                 return self.content["value"][idx].getPoints()
       
  1690             return None
       
  1691         setattr(cls, "getConnectionPoints", getConnectionPoints)
       
  1692 
       
  1693     if "connectionPointOut" in PLCOpenClasses:
       
  1694         cls = PLCOpenClasses["connectionPointOut"]
       
  1695 
       
  1696         def setRelPosition(self, x, y):
       
  1697             self.relPosition = PLCOpenClasses["position"]()
       
  1698             self.relPosition.setX(x)
       
  1699             self.relPosition.setY(y)
       
  1700         setattr(cls, "setRelPosition", setRelPosition)
       
  1701 
       
  1702         def getRelPosition(self):
       
  1703             if self.relPosition:
       
  1704                 return self.relPosition.getX(), self.relPosition.getY()
       
  1705             return self.relPosition
   919             return self.relPosition
  1706         setattr(cls, "getRelPosition", getRelPosition)
   920     setattr(cls, "getRelPosition", getRelPosition)
  1707 
   921 
  1708     if "value" in PLCOpenClasses:
   922     def addConnection(self):
  1709         cls = PLCOpenClasses["value"]
   923         if not self.content:
  1710         
   924             self.content = {"name":"connection","value":[PLCOpenClasses["connection"]()]}
  1711         def setValue(self, value):
   925         else:
  1712             try:
   926             self.content["value"].append(PLCOpenClasses["connection"]())
  1713                 value = eval(value)
   927     setattr(cls, "addConnection", addConnection)
  1714             except:
   928 
  1715                 pass
   929     def removeConnection(self, idx):
  1716             if type(value) == ListType:
   930         if self.content:
  1717                 arrayValue = PLCOpenClasses["value_arrayValue"]()
   931             self.content["value"].pop(idx)
  1718                 arrayValue.setValue(value)
   932         if len(self.content["value"]) == 0:
  1719                 self.content = {"name":"arrayValue","value":arrayValue}
   933             self.content = None
  1720             elif type(value) == DictType:
   934     setattr(cls, "removeConnection", removeConnection)
  1721                 structValue = PLCOpenClasses["value_structValue"]()
   935 
  1722                 structValue.setValue(value)
   936     def removeConnections(self):
  1723                 self.content = {"name":"structValue","value":structValue}
   937         if self.content:
  1724             else:
   938             self.content = None
  1725                 simpleValue = PLCOpenClasses["value_simpleValue"]()
   939     setattr(cls, "removeConnections", removeConnections)
  1726                 simpleValue.setValue(str(value))
   940     
  1727                 self.content = {"name":"simpleValue","value":simpleValue}
   941     def getConnections(self):
  1728         setattr(cls, "setValue", setValue)
   942         if self.content:
  1729         
   943             return self.content["value"]
  1730         def getValue(self):
   944     setattr(cls, "getConnections", getConnections)
  1731             value = self.content["value"].getValue()
   945     
  1732             try:
   946     def setConnectionId(self, idx, id):
  1733                 value = eval(value)
   947         if self.content:
  1734             except:
   948             self.content["value"][idx].setRefLocalId(id)
  1735                 pass
   949     setattr(cls, "setConnectionId", setConnectionId)
  1736             return value
   950     
  1737         setattr(cls, "getValue", getValue)
   951     def getConnectionId(self, idx):
  1738 
   952         if self.content:
  1739     if "value_arrayValue" in PLCOpenClasses:
   953             return self.content["value"][idx].getRefLocalId()
  1740         cls = PLCOpenClasses["value_arrayValue"]
   954         return None
  1741         
   955     setattr(cls, "getConnectionId", getConnectionId)
  1742         def setValue(self, array):
   956     
  1743             self.value = []
   957     def setConnectionPoints(self, idx, points):
  1744             for value in array:
   958         if self.content:
  1745                 element = PLCOpenClasses["arrayValue_value"]()
   959             self.content["value"][idx].setPoints(points)
  1746                 element.setValue(value)
   960     setattr(cls, "setConnectionPoints", setConnectionPoints)
  1747                 self.value.append(element)
   961 
  1748         setattr(cls, "setValue", setValue)
   962     def getConnectionPoints(self, idx):
  1749         
   963         if self.content:
  1750         def getValue(self):
   964             return self.content["value"][idx].getPoints()
  1751             return [element.getValue() for element in self.value]
   965         return None
  1752         setattr(cls, "getValue", getValue)
   966     setattr(cls, "getConnectionPoints", getConnectionPoints)
  1753 
   967 
  1754     if "value_structValue" in PLCOpenClasses:
   968 if "connectionPointOut" in PLCOpenClasses:
  1755         cls = PLCOpenClasses["value_structValue"]
   969     cls = PLCOpenClasses["connectionPointOut"]
  1756         
   970 
  1757         def setValue(self, dict):
   971     def setRelPosition(self, x, y):
  1758             self.value = []
   972         self.relPosition = PLCOpenClasses["position"]()
  1759             for name,value in dict.items():
   973         self.relPosition.setX(x)
  1760                 element = PLCOpenClasses["structValue_value"]()
   974         self.relPosition.setY(y)
  1761                 element.setMember(name)
   975     setattr(cls, "setRelPosition", setRelPosition)
  1762                 element.setValue(value)
   976 
  1763                 self.value.append(element)
   977     def getRelPosition(self):
  1764         setattr(cls, "setValue", setValue)
   978         if self.relPosition:
  1765         
   979             return self.relPosition.getX(), self.relPosition.getY()
  1766         def getValue(self):
   980         return self.relPosition
  1767             value = {}
   981     setattr(cls, "getRelPosition", getRelPosition)
  1768             for element in self.value:
   982 
  1769                 value[element.getMember()] = element.getValue()
   983 if "value" in PLCOpenClasses:
  1770             return value
   984     cls = PLCOpenClasses["value"]
  1771         setattr(cls, "getValue", getValue)
   985     
  1772 
   986     def setValue(self, value):
  1773 if sys:
   987         try:
  1774     sys.stdout = HolePseudoFile()
   988             value = eval(value)
  1775 xsdschema = pyxsval.parseAndValidateXmlSchema("plcopen/TC6_XML_V10_B.xsd")
   989         except:
  1776 if sys:
   990             pass
  1777     sys.stdout = sys.__stdout__
   991         if type(value) == ListType:
  1778 Generate_classes(xsdschema.getTree(), None)
   992             arrayValue = PLCOpenClasses["value_arrayValue"]()
  1779 
   993             arrayValue.setValue(value)
  1780 PLCOpenClasses = {}
   994             self.content = {"name":"arrayValue","value":arrayValue}
  1781 PLCOpenTypes = {}
   995         elif type(value) == DictType:
  1782 #for classname, classe in classes.items():
   996             structValue = PLCOpenClasses["value_structValue"]()
  1783 #    print "%s : %s\n"%(classname, str(classe))
   997             structValue.setValue(value)
  1784 """classnames = classes.keys()
   998             self.content = {"name":"structValue","value":structValue}
  1785 classnames.sort()
   999         else:
  1786 for classname in classnames:
  1000             simpleValue = PLCOpenClasses["value_simpleValue"]()
  1787     print classname"""
  1001             simpleValue.setValue(str(value))
  1788 for classe in classes.keys():
  1002             self.content = {"name":"simpleValue","value":simpleValue}
  1789     CreateClass(classe)
  1003     setattr(cls, "setValue", setValue)
  1790 Generate_Methods()
  1004     
       
  1005     def getValue(self):
       
  1006         value = self.content["value"].getValue()
       
  1007         try:
       
  1008             value = eval(value)
       
  1009         except:
       
  1010             pass
       
  1011         return value
       
  1012     setattr(cls, "getValue", getValue)
       
  1013 
       
  1014 if "value_arrayValue" in PLCOpenClasses:
       
  1015     cls = PLCOpenClasses["value_arrayValue"]
       
  1016     
       
  1017     def setValue(self, array):
       
  1018         self.value = []
       
  1019         for value in array:
       
  1020             element = PLCOpenClasses["arrayValue_value"]()
       
  1021             element.setValue(value)
       
  1022             self.value.append(element)
       
  1023     setattr(cls, "setValue", setValue)
       
  1024     
       
  1025     def getValue(self):
       
  1026         return [element.getValue() for element in self.value]
       
  1027     setattr(cls, "getValue", getValue)
       
  1028 
       
  1029 if "value_structValue" in PLCOpenClasses:
       
  1030     cls = PLCOpenClasses["value_structValue"]
       
  1031     
       
  1032     def setValue(self, dict):
       
  1033         self.value = []
       
  1034         for name,value in dict.items():
       
  1035             element = PLCOpenClasses["structValue_value"]()
       
  1036             element.setMember(name)
       
  1037             element.setValue(value)
       
  1038             self.value.append(element)
       
  1039     setattr(cls, "setValue", setValue)
       
  1040     
       
  1041     def getValue(self):
       
  1042         value = {}
       
  1043         for element in self.value:
       
  1044             value[element.getMember()] = element.getValue()
       
  1045         return value
       
  1046     setattr(cls, "getValue", getValue)