etisserant@0: #!/usr/bin/env python etisserant@0: # -*- coding: utf-8 -*- etisserant@0: etisserant@0: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor etisserant@0: #based on the plcopen standard. etisserant@0: # etisserant@0: #Copyright (C): Edouard TISSERANT and Laurent BESSARD etisserant@0: # etisserant@0: #See COPYING file for copyrights details. etisserant@0: # etisserant@0: #This library is free software; you can redistribute it and/or etisserant@0: #modify it under the terms of the GNU Lesser General Public etisserant@0: #License as published by the Free Software Foundation; either etisserant@0: #version 2.1 of the License, or (at your option) any later version. etisserant@0: # etisserant@0: #This library is distributed in the hope that it will be useful, etisserant@0: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: #Lesser General Public License for more details. etisserant@0: # etisserant@0: #You should have received a copy of the GNU Lesser General Public etisserant@0: #License along with this library; if not, write to the Free Software etisserant@0: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: etisserant@0: from xml.parsers import expat etisserant@0: from minixsv import pyxsval etisserant@0: from random import * etisserant@0: etisserant@0: from types import * etisserant@0: from datetime import * etisserant@0: etisserant@0: import sys,re etisserant@0: etisserant@0: classes = {} etisserant@0: TimeType = time(0,0,0).__class__ etisserant@0: DateType = date(1,1,1).__class__ etisserant@0: DateTimeType = datetime(1,1,1,0,0,0).__class__ etisserant@0: etisserant@0: """ etisserant@0: Dictionary that makes the relation between var names in plcopen and displayed values etisserant@0: """ etisserant@0: VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars", etisserant@0: "Output" : "outputVars", "InOut" : "inOutVars", "External" : "externalVars", etisserant@0: "Global" : "globalVars", "Access" : "accessVars"} etisserant@0: etisserant@0: """ etisserant@0: Define in which order var types must be displayed etisserant@0: """ etisserant@0: VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"] etisserant@0: etisserant@0: """ etisserant@0: Regular expression models for extracting dates and times from a string etisserant@0: """ etisserant@0: time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2})') etisserant@0: date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})') etisserant@0: datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2})') etisserant@0: etisserant@0: """ etisserant@0: Define which action qualifier must be associated with a duration etisserant@0: """ etisserant@0: QualifierList = {"N" : False, "R" : False, "S" : False, "L" : True, "D" : True, etisserant@0: "P" : False, "P0" : False, "P1" : False, "SD" : True, "DS" : True, "SL" : True} etisserant@0: etisserant@0: """ etisserant@0: pyxsval is not complete and the parts that are not supported print some error etisserant@0: reports. This class is used for not displaying them etisserant@0: """ etisserant@0: class HolePseudoFile: etisserant@0: """ Base class for file like objects to facilitate StdOut for the Shell.""" etisserant@0: def __init__(self, output = None): etisserant@0: if output is None: output = [] etisserant@0: self.output = output etisserant@0: etisserant@0: def writelines(self, l): etisserant@0: map(self.write, l) etisserant@0: etisserant@0: def write(self, s): etisserant@0: pass etisserant@0: etisserant@0: def flush(self): etisserant@0: pass etisserant@0: etisserant@0: def isatty(self): etisserant@0: return false etisserant@0: etisserant@0: """ etisserant@0: This function calculates the number of whitespace for indentation etisserant@0: """ etisserant@0: def getIndent(indent, balise): etisserant@0: first = indent * 2 etisserant@0: second = first + len(balise) + 1 etisserant@0: return "\t".expandtabs(first), "\t".expandtabs(second) etisserant@0: etisserant@0: """ etisserant@0: This function recursively creates a definition of the classes and their attributes etisserant@0: for plcopen from the xsd file of plcopen opened in a DOM model etisserant@0: """ etisserant@0: def Generate_classes(tree, parent, sequence = False): etisserant@0: attributes = {} etisserant@0: inheritance = [] etisserant@0: if sequence: etisserant@0: order = [] etisserant@0: # The lists of attributes and inheritance of the node are generated from the childrens etisserant@0: for node in tree.childNodes: etisserant@0: # We make fun of #text elements and all other tags that don't are xsd tags etisserant@0: if node.nodeName != "#text" and node.nodeName.startswith("xsd:"): etisserant@0: recursion = False etisserant@0: name = node.nodeName[4:].encode() etisserant@0: etisserant@0: # This tags defines an attribute of the class etisserant@0: if name in ["element", "attribute"]: etisserant@0: nodename = GetAttributeValue(node._attrs["name"]) etisserant@0: if "type" in node._attrs: etisserant@0: nodetype = GetAttributeValue(node._attrs["type"]) etisserant@0: else: etisserant@0: # The type of attribute is defines in the child tree so we generate a new class etisserant@0: # No name is defined so we create one from nodename and parent class name etisserant@0: # (because some different nodes can have the same name) etisserant@0: if parent: etisserant@0: classname = "%s_%s"%(parent, nodename) etisserant@0: else: etisserant@0: classname = nodename etisserant@0: Generate_classes(node, classname) etisserant@0: nodetype = "ppx:%s"%classname etisserant@0: if name == "attribute": etisserant@0: if "use" in node._attrs: etisserant@0: use = GetAttributeValue(node._attrs["use"]) etisserant@0: else: etisserant@0: use = "optional" etisserant@0: if name == "element": etisserant@0: # If a tag can be written more than one time we define a list attribute etisserant@0: if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded": etisserant@0: nodetype = "%s[]"%nodetype etisserant@0: if "minOccurs" in node._attrs and GetAttributeValue(node._attrs["minOccurs"]) == "0": etisserant@0: use = "optional" etisserant@0: else: etisserant@0: use = "required" etisserant@0: attributes[nodename] = (nodetype, name, use) etisserant@0: if sequence: etisserant@0: order.append(nodename) etisserant@0: etisserant@0: # This tag defines a new class etisserant@0: elif name == "complexType" or name == "simpleType": etisserant@0: if "name" in node._attrs: etisserant@0: classname = GetAttributeValue(node._attrs["name"]) etisserant@0: super, attrs = Generate_classes(node, classname) etisserant@0: else: etisserant@0: classname = parent etisserant@0: super, attrs = Generate_classes(node, classname.split("_")[-1]) etisserant@0: # When all attributes and inheritances have been extracted, the etisserant@0: # values are added in the list of classes to create etisserant@0: if classname not in classes: etisserant@0: classes[classname] = (super, attrs) etisserant@0: elif classes[classname] != (super, attrs): etisserant@0: print "A different class has already got %s for name"%classname etisserant@0: etisserant@0: # This tag defines an attribute that can have different types etisserant@0: elif name == "choice": etisserant@0: super, attrs = Generate_classes(node, parent) etisserant@0: if "ref" in attrs.keys(): etisserant@0: choices = attrs etisserant@0: else: etisserant@0: choices = {} etisserant@0: for attr, (attr_type, xml_type, write_type) in attrs.items(): etisserant@0: choices[attr] = attr_type etisserant@0: if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded": etisserant@0: attributes["multichoice_content"] = choices etisserant@0: if sequence: etisserant@0: order.append("multichoice_content") etisserant@0: else: etisserant@0: attributes["choice_content"] = choices etisserant@0: if sequence: etisserant@0: order.append("choice_content") etisserant@0: etisserant@0: # This tag defines the order in which class attributes must be written etisserant@0: # in plcopen xml file. We have to store this order like an attribute etisserant@0: elif name in "sequence": etisserant@0: super, attrs, order = Generate_classes(node, parent, True) etisserant@0: if "maxOccurs" in node._attrs and GetAttributeValue(node._attrs["maxOccurs"]) == "unbounded": etisserant@0: for attr, (attr_type, xml_type, write_type) in attrs.items(): etisserant@0: attrs[attr] = ("%s[]"%attr_type, xml_type, write_type) etisserant@0: if "minOccurs" in node._attrs and GetAttributeValue(node._attrs["minOccurs"]) == "0": etisserant@0: for attr, (attr_type, xml_type, write_type) in attrs.items(): etisserant@0: attrs[attr] = (attr_type, xml_type, "optional") etisserant@0: inheritance.extend(super) etisserant@0: attributes.update(attrs) etisserant@0: attributes["order"] = order etisserant@0: etisserant@0: # This tag defines of types etisserant@0: elif name == "group": etisserant@0: if "name" in node._attrs: etisserant@0: nodename = GetAttributeValue(node._attrs["name"]) etisserant@0: super, attrs = Generate_classes(node, None) etisserant@0: classes[nodename] = (super, {"group":attrs["choice_content"]}) etisserant@0: elif "ref" in node._attrs: etisserant@0: if "ref" not in attributes: etisserant@0: attributes["ref"] = [GetAttributeValue(node._attrs["ref"])] etisserant@0: else: etisserant@0: attributes["ref"].append(GetAttributeValue(node._attrs["ref"])) etisserant@0: etisserant@0: # This tag define a base class for the node etisserant@0: elif name == "extension": etisserant@0: super = GetAttributeValue(node._attrs["base"]) etisserant@0: inheritance.append(super[4:]) etisserant@0: recursion = True etisserant@0: etisserant@0: # This tag defines a restriction on the type of attribute etisserant@0: elif name == "restriction": etisserant@0: attributes["basetype"] = GetAttributeValue(node._attrs["base"]) etisserant@0: recursion = True etisserant@0: etisserant@0: # This tag defines an enumerated type etisserant@0: elif name == "enumeration": etisserant@0: if "enum" not in attributes: etisserant@0: attributes["enum"] = [GetAttributeValue(node._attrs["value"])] etisserant@0: else: etisserant@0: attributes["enum"].append(GetAttributeValue(node._attrs["value"])) etisserant@0: etisserant@0: # This tags defines a restriction on a numerical value etisserant@0: elif name in ["minInclusive","maxInclusive"]: etisserant@0: if "limit" not in attributes: etisserant@0: attributes["limit"] = {} etisserant@0: if name == "minInclusive": etisserant@0: attributes["limit"]["min"] = eval(GetAttributeValue(node._attrs["value"])) etisserant@0: elif name == "maxInclusive": etisserant@0: attributes["limit"]["max"] = eval(GetAttributeValue(node._attrs["value"])) etisserant@0: etisserant@0: # This tag are not important but their childrens are. The childrens are then parsed. etisserant@0: elif name in ["complexContent", "schema"]: etisserant@0: recursion = True etisserant@0: etisserant@0: # We make fun of xsd documentation etisserant@0: elif name in ["annotation"]: etisserant@0: pass etisserant@0: etisserant@0: else: etisserant@0: #print name etisserant@0: Generate_classes(node, parent) etisserant@0: etisserant@0: # Parse the childrens of node etisserant@0: if recursion: etisserant@0: super, attrs = Generate_classes(node, parent) etisserant@0: inheritance.extend(super) etisserant@0: attributes.update(attrs) etisserant@0: etisserant@0: # if sequence tag have been found, order is returned etisserant@0: if sequence: etisserant@0: return inheritance, attributes, order etisserant@0: else: etisserant@0: return inheritance, attributes etisserant@0: """ etisserant@0: Function that extracts data from a node etisserant@0: """ etisserant@0: def GetAttributeValue(attr): etisserant@0: if len(attr.childNodes) == 1: etisserant@0: return attr.childNodes[0].data.encode() etisserant@0: else: etisserant@0: return "" etisserant@0: etisserant@0: """ etisserant@0: Funtion that returns the Python type and default value for a given xsd type etisserant@0: """ etisserant@0: def GetTypeInitialValue(attr_type): etisserant@0: type_compute = attr_type[4:].replace("[]", "") etisserant@0: if attr_type.startswith("xsd:"): etisserant@0: if type_compute == "boolean": etisserant@0: return BooleanType, "False" etisserant@0: elif type_compute in ["decimal","unsignedLong","long","integer"]: etisserant@0: return IntType, "0" etisserant@0: elif type_compute in ["string","anyURI","NMTOKEN"]: etisserant@0: return StringType, "\"\"" etisserant@0: elif type_compute == "time": etisserant@0: return TimeType, "time(0,0,0)" etisserant@0: elif type_compute == "date": etisserant@0: return DateType, "date(1,1,1)" etisserant@0: elif type_compute == "dateTime": etisserant@0: return DateTimeType, "datetime(1,1,1,0,0,0)" etisserant@0: elif type_compute == "language": etisserant@0: return StringType, "\"en-US\"" etisserant@0: else: etisserant@0: print "Can't affect: %s"%type_compute etisserant@0: elif attr_type.startswith("ppx:"): etisserant@0: if type_compute in PLCOpenClasses: etisserant@0: return PLCOpenClasses[type_compute],"%s()"%type_compute etisserant@0: etisserant@0: """ etisserant@0: Function that computes value from a python type (Only Boolean are critical because etisserant@0: there is no uppercase in plcopen) etisserant@0: """ etisserant@0: def ComputeValue(value): etisserant@0: if type(value) == BooleanType: etisserant@0: if value: etisserant@0: return "true" etisserant@0: else: etisserant@0: return "false" etisserant@0: else: etisserant@0: return str(value) etisserant@0: etisserant@0: """ etisserant@0: Function that extracts a value from a string following the xsd type given etisserant@0: """ etisserant@0: def GetComputedValue(attr_type, value): etisserant@0: type_compute = attr_type[4:].replace("[]", "") etisserant@0: if type_compute == "boolean": etisserant@0: if value == "true": etisserant@0: return True etisserant@0: elif value == "false": etisserant@0: return False etisserant@0: else: etisserant@0: raise ValueError, "\"%s\" is not a valid boolean!"%value etisserant@0: elif type_compute in ["decimal","unsignedLong","long","integer"]: etisserant@0: return int(value) etisserant@0: elif type_compute in ["string","anyURI","NMTOKEN","language"]: etisserant@0: return value etisserant@0: elif type_compute == "time": etisserant@0: result = time_model.match(value) etisserant@0: if result: etisserant@0: time_values = [int(v) for v in result.groups()] etisserant@0: return time(*time_values) etisserant@0: else: etisserant@0: raise ValueError, "\"%s\" is not a valid time!"%value etisserant@0: elif type_compute == "date": etisserant@0: result = date_model.match(value) etisserant@0: if result: etisserant@0: date_values = [int(v) for v in result.groups()] etisserant@0: return date(*date_values) etisserant@0: else: etisserant@0: raise ValueError, "\"%s\" is not a valid date!"%value etisserant@0: elif type_compute == "dateTime": etisserant@0: result = datetime_model.match(value) etisserant@0: if result: etisserant@0: datetime_values = [int(v) for v in result.groups()] etisserant@0: return datetime(*datetime_values) etisserant@0: else: etisserant@0: raise ValueError, "\"%s\" is not a valid datetime!"%value etisserant@0: else: etisserant@0: print "Can't affect: %s"%type_compute etisserant@0: return None etisserant@0: etisserant@0: """ etisserant@0: This is the Metaclass for PLCOpen element classes. It generates automatically etisserant@0: the basic useful methods for manipulate the differents attributes of the classes etisserant@0: """ etisserant@0: class MetaClass(type): etisserant@0: etisserant@0: def __init__(cls, name, bases, dict): etisserant@0: super(MetaClass, cls).__init__(name, bases, {}) etisserant@0: #print name, bases, dict, "\n" etisserant@0: initialValues = {} etisserant@0: for attr, values in dict.items(): etisserant@0: if attr in ["order", "basetype"]: etisserant@0: pass etisserant@0: etisserant@0: # Class is a enumerated type etisserant@0: elif attr == "enum": etisserant@0: value_type, initial = GetTypeInitialValue(dict["basetype"]) etisserant@0: initialValues["value"] = "\"%s\""%values[0] etisserant@0: setattr(cls, "value", values[0]) etisserant@0: setattr(cls, "setValue", MetaClass.generateSetEnumMethod(cls, values, value_type)) etisserant@0: setattr(cls, "getValue", MetaClass.generateGetMethod(cls, "value")) etisserant@0: etisserant@0: # Class is a limited type etisserant@0: elif attr == "limit": etisserant@0: value_type, initial = GetTypeInitialValue(dict["basetype"]) etisserant@0: initial = 0 etisserant@0: if "min" in values: etisserant@0: initial = max(initial, values["min"]) etisserant@0: if "max" in values: etisserant@0: initial = min(initial, values["max"]) etisserant@0: initialValues["value"] = "%d"%initial etisserant@0: setattr(cls, "value", initial) etisserant@0: setattr(cls, "setValue", MetaClass.generateSetLimitMethod(cls, values, value_type)) etisserant@0: setattr(cls, "getValue", MetaClass.generateGetMethod(cls, "value")) etisserant@0: etisserant@0: # Class has an attribute that can have different value types etisserant@0: elif attr == "choice_content": etisserant@0: setattr(cls, "content", None) etisserant@0: initialValues["content"] = "None" etisserant@0: setattr(cls, "deleteContent", MetaClass.generateDeleteMethod(cls, "content")) etisserant@0: setattr(cls, "setContent", MetaClass.generateSetChoiceMethod(cls, values)) etisserant@0: setattr(cls, "getContent", MetaClass.generateGetMethod(cls, "content")) etisserant@0: elif attr == "multichoice_content": etisserant@0: setattr(cls, "content", []) etisserant@0: initialValues["content"] = "[]" etisserant@0: setattr(cls, "appendContent", MetaClass.generateAppendChoiceMethod(cls, values)) etisserant@0: setattr(cls, "insertContent", MetaClass.generateInsertChoiceMethod(cls, values)) etisserant@0: setattr(cls, "removeContent", MetaClass.generateRemoveMethod(cls, "content")) etisserant@0: setattr(cls, "countContent", MetaClass.generateCountMethod(cls, "content")) etisserant@0: setattr(cls, "setContent", MetaClass.generateSetMethod(cls, "content", ListType)) etisserant@0: setattr(cls, "getContent", MetaClass.generateGetMethod(cls, "content")) etisserant@0: etisserant@0: # It's an attribute of the class etisserant@0: else: etisserant@0: attrname = attr[0].upper()+attr[1:] etisserant@0: attr_type, xml_type, write_type = values etisserant@0: value_type, initial = GetTypeInitialValue(attr_type) etisserant@0: # Value of the attribute is a list etisserant@0: if attr_type.endswith("[]"): etisserant@0: setattr(cls, attr, []) etisserant@0: initialValues[attr] = "[]" etisserant@0: setattr(cls, "append"+attrname, MetaClass.generateAppendMethod(cls, attr, value_type)) etisserant@0: setattr(cls, "insert"+attrname, MetaClass.generateInsertMethod(cls, attr, value_type)) etisserant@0: setattr(cls, "remove"+attrname, MetaClass.generateRemoveMethod(cls, attr)) etisserant@0: setattr(cls, "count"+attrname, MetaClass.generateCountMethod(cls, attr)) etisserant@0: setattr(cls, "set"+attrname, MetaClass.generateSetMethod(cls, attr, ListType)) etisserant@0: else: etisserant@0: if write_type == "optional": etisserant@0: setattr(cls, attr, None) etisserant@0: initialValues[attr] = "None" etisserant@0: setattr(cls, "add"+attrname, MetaClass.generateAddMethod(cls, attr, initial)) etisserant@0: setattr(cls, "delete"+attrname, MetaClass.generateDeleteMethod(cls, attr)) etisserant@0: else: etisserant@0: setattr(cls, attr, initial) etisserant@0: initialValues[attr] = initial etisserant@0: setattr(cls, "set"+attrname, MetaClass.generateSetMethod(cls, attr, value_type)) etisserant@0: setattr(cls, "get"+attrname, MetaClass.generateGetMethod(cls, attr)) etisserant@0: setattr(cls, "__init__", MetaClass.generateInitMethod(cls, bases, initialValues)) etisserant@0: setattr(cls, "loadXMLTree", MetaClass.generateLoadXMLTree(cls, bases, dict)) etisserant@0: setattr(cls, "generateXMLText", MetaClass.generateGenerateXMLText(cls, bases, dict)) etisserant@0: setattr(cls, "singleLineAttributes", True) etisserant@0: etisserant@0: """ etisserant@0: Method that generate the method for loading an xml tree by following the etisserant@0: attributes list defined etisserant@0: """ etisserant@0: def generateLoadXMLTree(cls, bases, dict): etisserant@0: def loadXMLTreeMethod(self, tree): etisserant@0: # If class is derived, values of inheritance classes are loaded etisserant@0: for base in bases: etisserant@0: base.loadXMLTree(self, tree) etisserant@0: # Class is a enumerated or limited value etisserant@0: if "enum" in dict.keys() or "limit" in dict.keys(): etisserant@0: attr_value = GetAttributeValue(tree) etisserant@0: attr_type = dict["basetype"] etisserant@0: val = GetComputedValue(attr_type, attr_value) etisserant@0: self.setValue(val) etisserant@0: else: etisserant@0: etisserant@0: # Load the node attributes if they are defined in the list etisserant@0: for attrname, attr in tree._attrs.items(): etisserant@0: if attrname in dict.keys(): etisserant@0: attr_type, xml_type, write_type = dict[attrname] etisserant@0: attr_value = GetAttributeValue(attr) etisserant@0: if write_type != "optional" or attr_value != "": etisserant@0: # Extracts the value etisserant@0: if attr_type.startswith("xsd:"): etisserant@0: val = GetComputedValue(attr_type, attr_value) etisserant@0: elif attr_type.startswith("ppx:"): etisserant@0: val = eval("%s()"%attr_type[4:], globals().update(PLCOpenClasses)) etisserant@0: val.loadXMLTree(attr) etisserant@0: setattr(self, attrname, val) etisserant@0: etisserant@0: # Load the node childs if they are defined in the list etisserant@0: for node in tree.childNodes: etisserant@0: name = node.nodeName etisserant@0: # We make fun of #text elements etisserant@0: if name != "#text": etisserant@0: etisserant@0: # Class has an attribute that can have different value types etisserant@0: if "choice_content" in dict.keys() and name in dict["choice_content"].keys(): etisserant@0: attr_type = dict["choice_content"][name] etisserant@0: # Extracts the value etisserant@0: if attr_type.startswith("xsd:"): etisserant@0: attr_value = GetAttributeValue(node) etisserant@0: if write_type != "optional" or attr_value != "": etisserant@0: val = GetComputedValue(attr_type.replace("[]",""), attr_value) etisserant@0: else: etisserant@0: val = None etisserant@0: elif attr_type.startswith("ppx:"): etisserant@0: val = eval("%s()"%attr_type[4:].replace("[]",""), globals().update(PLCOpenClasses)) etisserant@0: val.loadXMLTree(node) etisserant@0: # Stock value in content attribute etisserant@0: if val: etisserant@0: if attr_type.endswith("[]"): etisserant@0: if self.content: etisserant@0: self.content["value"].append(val) etisserant@0: else: etisserant@0: self.content = {"name":name,"value":[val]} etisserant@0: else: etisserant@0: self.content = {"name":name,"value":val} etisserant@0: etisserant@0: # Class has a list of attributes that can have different value types etisserant@0: elif "multichoice_content" in dict.keys() and name in dict["multichoice_content"].keys(): etisserant@0: attr_type = dict["multichoice_content"][name] etisserant@0: # Extracts the value etisserant@0: if attr_type.startswith("xsd:"): etisserant@0: attr_value = GetAttributeValue(node) etisserant@0: if write_type != "optional" or attr_value != "": etisserant@0: val = GetComputedValue(attr_type, attr_value) etisserant@0: else: etisserant@0: val = None etisserant@0: elif attr_type.startswith("ppx:"): etisserant@0: val = eval("%s()"%attr_type[4:], globals().update(PLCOpenClasses)) etisserant@0: val.loadXMLTree(node) etisserant@0: # Add to content attribute list etisserant@0: if val: etisserant@0: self.content.append({"name":name,"value":val}) etisserant@0: etisserant@0: # The node child is defined in the list etisserant@0: elif name in dict.keys(): etisserant@0: attr_type, xml_type, write_type = dict[name] etisserant@0: # Extracts the value etisserant@0: if attr_type.startswith("xsd:"): etisserant@0: attr_value = GetAttributeValue(node) etisserant@0: if write_type != "optional" or attr_value != "": etisserant@0: val = GetComputedValue(attr_type.replace("[]",""), attr_value) etisserant@0: else: etisserant@0: val = None etisserant@0: elif attr_type.startswith("ppx:"): etisserant@0: val = eval("%s()"%attr_type[4:].replace("[]",""), globals().update(PLCOpenClasses)) etisserant@0: val.loadXMLTree(node) etisserant@0: # Stock value in attribute etisserant@0: if val: etisserant@0: if attr_type.endswith("[]"): etisserant@0: getattr(self, name).append(val) etisserant@0: else: etisserant@0: setattr(self, name, val) etisserant@0: return loadXMLTreeMethod etisserant@0: etisserant@0: """ etisserant@0: Method that generates the method for generating an xml text by following the etisserant@0: attributes list defined etisserant@0: """ etisserant@0: def generateGenerateXMLText(cls, bases, dict): etisserant@0: def generateXMLTextMethod(self, name, indent, extras = {}, derived = False): etisserant@0: ind1, ind2 = getIndent(indent, name) etisserant@0: if not derived: etisserant@0: text = ind1 + "<%s"%name etisserant@0: else: etisserant@0: text = "" etisserant@0: if len(bases) > 0: etisserant@0: base_extras = {} etisserant@0: if "order" in dict.keys(): etisserant@0: order = dict["order"] etisserant@0: else: etisserant@0: order = [] etisserant@0: if "choice_content" in dict.keys() and "choice_content" not in order: etisserant@0: order.append("choice_content") etisserant@0: if "multichoice_content" in dict.keys() and "multichoice_content" not in order: etisserant@0: order.append("multichoice_content") etisserant@0: size = 0 etisserant@0: first = True etisserant@0: for attr, value in extras.items(): etisserant@0: if not first and not self.singleLineAttributes: etisserant@0: text += "\n%s"%(ind2) etisserant@0: text += " %s=\"%s\""%(attr, ComputeValue(value)) etisserant@0: first = False etisserant@0: for attr, values in dict.items(): etisserant@0: if attr in ["order","choice_content","multichoice_content"]: etisserant@0: pass etisserant@0: elif attr in ["enum","limit"]: etisserant@0: if not derived: etisserant@0: text += ">%s\n"%(ComputeValue(self.value),name) etisserant@0: else: etisserant@0: text += ComputeValue(self.value) etisserant@0: return text etisserant@0: elif values[1] == "attribute": etisserant@0: value = getattr(self, attr, None) etisserant@0: if values[2] != "optional" or value != None: etisserant@0: if not first and not self.singleLineAttributes: etisserant@0: text += "\n%s"%(ind2) etisserant@0: if values[0].startswith("ppx"): etisserant@0: if len(bases) > 0: etisserant@0: base_extras[attr] = value.getValue() etisserant@0: else: etisserant@0: text += " %s=\"%s\""%(attr, ComputeValue(value.getValue())) etisserant@0: else: etisserant@0: if len(bases) > 0: etisserant@0: base_extras[attr] = value etisserant@0: else: etisserant@0: text += " %s=\"%s\""%(attr, ComputeValue(value)) etisserant@0: first = False etisserant@0: if len(bases) > 0: etisserant@0: first, new_text = bases[0].generateXMLText(self, name, indent, base_extras, True) etisserant@0: text += new_text etisserant@0: else: etisserant@0: first = True etisserant@0: ind3, ind4 = getIndent(indent + 1, name) etisserant@0: for attr in order: etisserant@0: value = getattr(self, attr, None) etisserant@0: if attr == "choice_content": etisserant@0: if self.content: etisserant@0: if first: etisserant@0: text += ">\n" etisserant@0: first = False etisserant@0: value_type = dict[attr][self.content["name"]] etisserant@0: if value_type.startswith("xsd:"): etisserant@0: if value_type.endswith("[]"): etisserant@0: for content in self.content["value"]: etisserant@0: text += ind1 + "<%s>%s\n"%(self.content["name"], ComputeValue(content), self.content["name"]) etisserant@0: else: etisserant@0: text += ind1 + "<%s>%s\n"%(self.content["name"], ComputeValue(self.content["value"]), self.content["name"]) etisserant@0: elif value_type.endswith("[]"): etisserant@0: for content in self.content["value"]: etisserant@0: text += content.generateXMLText(self.content["name"], indent + 1) etisserant@0: else: etisserant@0: text += self.content["value"].generateXMLText(self.content["name"], indent + 1) etisserant@0: elif attr == "multichoice_content": etisserant@0: if len(self.content) > 0: etisserant@0: for element in self.content: etisserant@0: if first: etisserant@0: text += ">\n" etisserant@0: first = False etisserant@0: value_type = dict[attr][element["name"]] etisserant@0: if value_type.startswith("xsd:"): etisserant@0: text += ind1 + "<%s>%s\n"%(element["name"], ComputeValue(element["value"]), element["name"]) etisserant@0: else: etisserant@0: text += element["value"].generateXMLText(element["name"], indent + 1) etisserant@0: elif dict[attr][2] != "optional" or value != None: etisserant@0: if dict[attr][0].endswith("[]"): etisserant@0: if first and len(value) > 0: etisserant@0: text += ">\n" etisserant@0: first = False etisserant@0: for element in value: etisserant@0: if dict[attr][0].startswith("xsd:"): etisserant@0: text += ind3 + "<%s>%s\n"%(attr, ComputeValue(element), attr) etisserant@0: else: etisserant@0: text += element.generateXMLText(attr, indent + 1) etisserant@0: else: etisserant@0: if first: etisserant@0: text += ">\n" etisserant@0: first = False etisserant@0: if dict[attr][0].startswith("xsd:"): etisserant@0: text += ind3 + "<%s>%s\n"%(attr, ComputeValue(value), attr) etisserant@0: else: etisserant@0: text += getattr(self, attr).generateXMLText(attr, indent + 1) etisserant@0: if not derived: etisserant@0: if first: etisserant@0: text += "/>\n" etisserant@0: else: etisserant@0: text += ind1 + "\n"%(name) etisserant@0: return text etisserant@0: else: etisserant@0: return first, text etisserant@0: return generateXMLTextMethod etisserant@0: etisserant@0: """ etisserant@0: Methods that generates the different methods for setting and getting the attributes etisserant@0: """ etisserant@0: etisserant@0: def generateInitMethod(cls, bases, dict): etisserant@0: def initMethod(self): etisserant@0: for base in bases: etisserant@0: base.__init__(self) etisserant@0: for attr, initial in dict.items(): etisserant@0: setattr(self, attr, eval(initial, globals().update(PLCOpenClasses))) etisserant@0: return initMethod etisserant@0: etisserant@0: def generateSetMethod(cls, attr, choice_type): etisserant@0: def setMethod(self, value): etisserant@0: setattr(self, attr, value) etisserant@0: return setMethod etisserant@0: etisserant@0: def generateSetChoiceMethod(cls, attr_type): etisserant@0: def setChoiceMethod(self, name, value): etisserant@0: self.content = {"name":name,"value":value} etisserant@0: return setChoiceMethod etisserant@0: etisserant@0: def generateSetEnumMethod(cls, enum, attr_type): etisserant@0: def setEnumMethod(self, value): etisserant@0: if value in enum: etisserant@0: self.value = value etisserant@0: else: etisserant@0: raise ValueError, "%s is not a valid value. Must be in %s"%(value, str(enum)) etisserant@0: return setEnumMethod etisserant@0: etisserant@0: def generateSetLimitMethod(cls, limit, attr_type): etisserant@0: def setMethod(self, value): etisserant@0: if "min" in limit and value < limit["min"]: etisserant@0: raise ValueError, "%s is not a valid value. Must be greater than %d"%(value, limit["min"]) etisserant@0: elif "max" in limit and value > limit["max"]: etisserant@0: raise ValueError, "%s is not a valid value. Must be smaller than %d"%(value, limit["max"]) etisserant@0: else: etisserant@0: self.value = value etisserant@0: return setMethod etisserant@0: etisserant@0: def generateGetMethod(cls, attr): etisserant@0: def getMethod(self): etisserant@0: return getattr(self, attr, None) etisserant@0: return getMethod etisserant@0: etisserant@0: def generateAddMethod(cls, attr, initial): etisserant@0: def addMethod(self): etisserant@0: setattr(self, attr, eval(initial, globals().update(PLCOpenClasses))) etisserant@0: return addMethod etisserant@0: etisserant@0: def generateDeleteMethod(cls, attr): etisserant@0: def deleteMethod(self): etisserant@0: setattr(self, attr, None) etisserant@0: return deleteMethod etisserant@0: etisserant@0: def generateAppendMethod(cls, attr, attr_type): etisserant@0: def appendMethod(self, value): etisserant@0: getattr(self, attr).append(value) etisserant@0: return appendMethod etisserant@0: etisserant@0: def generateInsertMethod(cls, attr, attr_type): etisserant@0: def insertMethod(self, index, value): etisserant@0: getattr(self, attr).insert(index, value) etisserant@0: return insertMethod etisserant@0: etisserant@0: def generateAppendChoiceMethod(cls, choice_types): etisserant@0: def appendMethod(self, name, value): etisserant@0: self.content.append({"name":name,"value":value}) etisserant@0: return appendMethod etisserant@0: etisserant@0: def generateInsertChoiceMethod(cls, choice_types): etisserant@0: def insertMethod(self, index, name, value): etisserant@0: self.content.insert(index, {"name":name,"value":value}) etisserant@0: return insertMethod etisserant@0: etisserant@0: def generateRemoveMethod(cls, attr): etisserant@0: def removeMethod(self, index): etisserant@0: getattr(self, attr).pop(index) etisserant@0: return removeMethod etisserant@0: etisserant@0: def generateCountMethod(cls, attr): etisserant@0: def countMethod(self): etisserant@0: return len(getattr(self, attr)) etisserant@0: return countMethod etisserant@0: etisserant@0: """ etisserant@0: Method that generate the classes etisserant@0: """ etisserant@0: def CreateClass(classe): etisserant@0: # Checks that classe haven't been generated yet etisserant@0: if classe not in PLCOpenClasses and classe not in PLCOpenTypes and classe in classes: etisserant@0: inheritance, attributes = classes[classe] etisserant@0: #print classe, inheritance, attributes etisserant@0: dict = {} etisserant@0: bases = [] etisserant@0: etisserant@0: # If inheritance classes haven't been generated etisserant@0: for base in inheritance: etisserant@0: if base not in PLCOpenClasses: etisserant@0: CreateClass(base) etisserant@0: bases.append(PLCOpenClasses[base]) etisserant@0: etisserant@0: # Checks that all attribute types are available etisserant@0: for attribute, type_attribute in attributes.items(): etisserant@0: if attribute == "group": etisserant@0: PLCOpenTypes[classe] = type_attribute etisserant@0: elif attribute == "ref": etisserant@0: PLCOpenTypes[classe] = {} etisserant@0: for attr in type_attribute: etisserant@0: if attr[4:] not in PLCOpenTypes: etisserant@0: CreateClass(attr[4:]) etisserant@0: PLCOpenTypes[classe].update(PLCOpenTypes[attr[4:]]) etisserant@0: elif attribute in ["choice_content","multichoice_content"]: etisserant@0: element_types = {} etisserant@0: for attr, value in type_attribute.items(): etisserant@0: if attr == "ref": etisserant@0: for ref in type_attribute["ref"]: etisserant@0: if ref[4:] not in PLCOpenTypes: etisserant@0: CreateClass(ref[4:]) etisserant@0: element_types.update(PLCOpenTypes[ref[4:]]) etisserant@0: else: etisserant@0: element_types[attr] = value etisserant@0: dict[attribute] = element_types etisserant@0: else: etisserant@0: dict[attribute] = type_attribute etisserant@0: if attribute == "enum": etisserant@0: PLCOpenTypes["%s_enum"%classe] = type_attribute etisserant@0: elif attribute not in ["limit", "order"]: etisserant@0: if type_attribute[0].startswith("ppx:"): etisserant@0: type_compute = type_attribute[0][4:].replace("[]","") etisserant@0: if type_compute not in PLCOpenClasses: etisserant@0: CreateClass(type_compute) etisserant@0: if "group" not in attributes.keys() and "ref" not in attributes.keys(): etisserant@0: cls = MetaClass.__new__(MetaClass, classe, tuple(bases), dict) etisserant@0: MetaClass.__init__(cls, classe, tuple(bases), dict) etisserant@0: PLCOpenClasses[classe] = cls etisserant@0: etisserant@0: def Generate_Methods(): etisserant@0: if "dataType" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["dataType"] etisserant@0: cls.value = None etisserant@0: etisserant@0: def getValue(self): etisserant@0: return self.value etisserant@0: setattr(cls, "getValue", getValue) etisserant@0: etisserant@0: def setValue(self, value): etisserant@0: self.value = value etisserant@0: setattr(cls, "setValue", setValue) etisserant@0: etisserant@0: def loadXMLTree(self, tree): etisserant@0: self.value = tree.childNodes[1].nodeName etisserant@0: setattr(cls, "loadXMLTree", loadXMLTree) etisserant@0: etisserant@0: def generateXMLText(self, name, indent, extras = {}): etisserant@0: ind1, ind2 = getIndent(indent, name) etisserant@0: text = ind1 + "<%s>\n"%name etisserant@0: ind3, ind4 = getIndent(indent + 1, self.value) etisserant@0: text += ind3 + "<%s/>\n"%self.value etisserant@0: text += ind1 + "\n"%name etisserant@0: return text etisserant@0: setattr(cls, "generateXMLText", generateXMLText) etisserant@0: etisserant@0: if "formattedText" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["formattedText"] etisserant@0: cls.text = "" etisserant@0: etisserant@0: def getText(self): etisserant@0: return self.text etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: def setText(self, text): etisserant@0: self.text = text etisserant@0: setattr(cls, "setText", setText) etisserant@0: etisserant@0: def loadXMLTree(self, tree): etisserant@0: self.text = GetAttributeValue(tree) etisserant@0: if len(self.text.splitlines()) > 1: etisserant@0: self.text = self.text[1:].rstrip() etisserant@0: setattr(cls, "loadXMLTree", loadXMLTree) etisserant@0: etisserant@0: def generateXMLText(self, name, indent, extras = {}): etisserant@0: ind1, ind2 = getIndent(indent, name) etisserant@0: if len(self.text.splitlines()) > 1: etisserant@0: text = ind1 + "<%s>\n"%name etisserant@0: text += "%s\n"%self.text etisserant@0: text += ind1 + "\n"%name etisserant@0: return text etisserant@0: else: etisserant@0: return ind1 + "<%s>%s\n"%(name, self.text, name) etisserant@0: setattr(cls, "generateXMLText", generateXMLText) etisserant@0: etisserant@0: if "project" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["project"] etisserant@0: cls.singleLineAttributes = False etisserant@0: etisserant@0: def getFileHeader(self): etisserant@0: fileheader = {} etisserant@0: fileheader["companyName"] = self.fileHeader.getCompanyName() etisserant@0: if self.fileHeader.getCompanyURL(): etisserant@0: fileheader["companyURL"] = self.fileHeader.getCompanyURL() etisserant@0: fileheader["productName"] = self.fileHeader.getProductName() etisserant@0: fileheader["productVersion"] = self.fileHeader.getProductVersion() etisserant@0: if self.fileHeader.getProductRelease(): etisserant@0: fileheader["productRelease"] = self.fileHeader.getProductRelease() etisserant@0: fileheader["creationDateTime"] = self.fileHeader.getCreationDateTime() etisserant@0: if self.fileHeader.getContentDescription(): etisserant@0: fileheader["contentDescription"] = self.fileHeader.getContentDescription() etisserant@0: return fileheader etisserant@0: setattr(cls, "getFileHeader", getFileHeader) etisserant@0: etisserant@0: def setFileHeader(self, fileheader): etisserant@0: self.fileHeader.setCompanyName(fileheader["companyName"]) etisserant@0: if "companyURL" in fileheader: etisserant@0: self.fileHeader.setCompanyURL(fileheader["companyURL"]) etisserant@0: self.fileHeader.setProductName(fileheader["productName"]) etisserant@0: self.fileHeader.setProductVersion(fileheader["productVersion"]) etisserant@0: if "productRelease" in fileheader: etisserant@0: self.fileHeader.setProductRelease(fileheader["productRelease"]) etisserant@0: self.fileHeader.setCreationDateTime(fileheader["creationDateTime"]) etisserant@0: if "contentDescription" in fileheader: etisserant@0: self.fileHeader.setContentDescription(fileheader["contentDescription"]) etisserant@0: setattr(cls, "setFileHeader", setFileHeader) etisserant@0: etisserant@0: def setName(self, name): etisserant@0: self.contentHeader.setName(name) etisserant@0: setattr(cls, "setName", setName) etisserant@0: etisserant@0: def getName(self): etisserant@0: return self.contentHeader.getName() etisserant@0: setattr(cls, "getName", getName) etisserant@0: etisserant@0: def getPous(self): etisserant@0: return self.types.getPouElements() etisserant@0: setattr(cls, "getPous", getPous) etisserant@0: etisserant@0: def getPou(self, name): etisserant@0: return self.types.getPouElement(name) etisserant@0: setattr(cls, "getPou", getPou) etisserant@0: etisserant@0: def appendPou(self, name, pou_type, body_type): etisserant@0: self.types.appendPouElement(name, pou_type, body_type) etisserant@0: setattr(cls, "appendPou", appendPou) etisserant@0: etisserant@0: def insertPou(self, index, pou): etisserant@0: self.types.insertPouElement(index, pou) etisserant@0: setattr(cls, "insertPou", insertPou) etisserant@0: etisserant@0: def removePou(self, name): etisserant@0: self.types.removePouElement(name) etisserant@0: setattr(cls, "removePou", removePou) etisserant@0: etisserant@0: def getConfigurations(self): etisserant@0: configurations = self.instances.configurations.getConfiguration() etisserant@0: if configurations: etisserant@0: return configurations etisserant@0: return [] etisserant@0: setattr(cls, "getConfigurations", getConfigurations) etisserant@0: etisserant@0: def getConfiguration(self, name): etisserant@0: for configuration in self.instances.configurations.getConfiguration(): etisserant@0: if configuration.getName() == name: etisserant@0: return configuration etisserant@0: return None etisserant@0: setattr(cls, "getConfiguration", getConfiguration) etisserant@0: etisserant@0: def addConfiguration(self, name): etisserant@0: for configuration in self.instances.configurations.getConfiguration(): etisserant@0: if configuration.getName() == name: etisserant@0: raise ValueError, "\"%s\" configuration already exists !!!"%name etisserant@0: new_configuration = PLCOpenClasses["configurations_configuration"]() etisserant@0: new_configuration.setName(name) etisserant@0: self.instances.configurations.appendConfiguration(new_configuration) etisserant@0: setattr(cls, "addConfiguration", addConfiguration) etisserant@0: etisserant@0: def removeConfiguration(self, name): etisserant@0: found = False etisserant@0: for idx, configuration in enumerate(self.instances.configurations.getConfiguration()): etisserant@0: if configuration.getName() == name: etisserant@0: self.instances.configurations.removeConfiguration(idx) etisserant@0: found = True etisserant@0: break etisserant@0: if not found: etisserant@0: raise ValueError, "\"%s\" configuration doesn't exist !!!"%name etisserant@0: setattr(cls, "removeConfiguration", removeConfiguration) etisserant@0: etisserant@0: def getConfigurationResource(self, config_name, name): etisserant@0: configuration = self.getConfiguration(config_name) etisserant@0: if configuration: etisserant@0: for resource in configuration.getResource(): etisserant@0: if resource.getName() == name: etisserant@0: return resource etisserant@0: return None etisserant@0: setattr(cls, "getConfigurationResource", getConfigurationResource) etisserant@0: etisserant@0: def addConfigurationResource(self, config_name, name): etisserant@0: configuration = self.getConfiguration(config_name) etisserant@0: if configuration: etisserant@0: for resource in configuration.getResource(): etisserant@0: if resource.getName() == name: etisserant@0: raise ValueError, "\"%s\" resource already exists in \"%s\" configuration !!!"%(name, config_name) etisserant@0: new_resource = PLCOpenClasses["configuration_resource"]() etisserant@0: new_resource.setName(name) etisserant@0: configuration.appendResource(new_resource) etisserant@0: setattr(cls, "addConfigurationResource", addConfigurationResource) etisserant@0: etisserant@0: def removeConfigurationResource(self, config_name, name): etisserant@0: configuration = self.getConfiguration(config_name) etisserant@0: if configuration: etisserant@0: found = False etisserant@0: for idx, resource in enumerate(configuration.getResource()): etisserant@0: if resource.getName() == name: etisserant@0: configuration.removeResource(idx) etisserant@0: found = True etisserant@0: break etisserant@0: if not found: etisserant@0: raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name) etisserant@0: setattr(cls, "removeConfigurationResource", removeConfigurationResource) etisserant@0: etisserant@0: PLCOpenClasses["project_fileHeader"].singleLineAttributes = False etisserant@0: etisserant@0: if "project_types" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["project_types"] etisserant@0: etisserant@0: def getPouElements(self): etisserant@0: return self.pous.getPou() etisserant@0: setattr(cls, "getPouElements", getPouElements) etisserant@0: etisserant@0: def getPouElement(self, name): etisserant@0: elements = self.pous.getPou() etisserant@0: for element in elements: etisserant@0: if element.getName() == name: etisserant@0: return element etisserant@0: return None etisserant@0: setattr(cls, "getPouElement", getPouElement) etisserant@0: etisserant@0: def appendPouElement(self, name, pou_type, body_type): etisserant@0: for element in self.pous.getPou(): etisserant@0: if element.getName() == name: etisserant@0: raise ValueError, "\"%s\" POU already exists !!!"%name etisserant@0: new_pou = PLCOpenClasses["pous_pou"]() etisserant@0: new_pou.setName(name) etisserant@0: new_pou.pouType.setValue(pou_type) etisserant@0: new_pou.setBody(PLCOpenClasses["body"]()) etisserant@0: new_pou.setBodyType(body_type) etisserant@0: self.pous.appendPou(new_pou) etisserant@0: setattr(cls, "appendPouElement", appendPouElement) etisserant@0: etisserant@0: def insertPouElement(self, index, pou): etisserant@0: self.pous.insertPou(index, pou) etisserant@0: setattr(cls, "insertPouElement", insertPouElement) etisserant@0: etisserant@0: def removePouElement(self, name): etisserant@0: found = False etisserant@0: for idx, element in enumerate(self.pous.getPou()): etisserant@0: if element.getName() == name: etisserant@0: self.pous.removePou(idx) etisserant@0: found = True etisserant@0: break etisserant@0: if not found: etisserant@0: raise ValueError, "\"%s\" POU doesn't exist !!!"%name etisserant@0: setattr(cls, "removePouElement", removePouElement) etisserant@0: etisserant@0: def setBodyType(self, type): etisserant@0: if type == "IL": etisserant@0: self.body.setContent("IL", PLCOpenClasses["formattedText"]()) etisserant@0: elif type == "ST": etisserant@0: self.body.setContent("ST", PLCOpenClasses["formattedText"]()) etisserant@0: elif type == "LD": etisserant@0: self.body.setContent("LD", PLCOpenClasses["body_LD"]()) etisserant@0: elif type == "FBD": etisserant@0: self.body.setContent("FBD", PLCOpenClasses["body_FBD"]()) etisserant@0: elif type == "SFC": etisserant@0: self.body.setContent("SFC", PLCOpenClasses["body_SFC"]()) etisserant@0: else: etisserant@0: raise ValueError, "%s isn't a valid body type!"%type etisserant@0: etisserant@0: def getBodyType(self): etisserant@0: return self.body.getContent()["name"] etisserant@0: etisserant@0: def addInstance(self, name, instance): etisserant@0: self.body.appendContentInstance(name, instance) etisserant@0: etisserant@0: def getInstances(self): etisserant@0: return self.body.getContentInstances() etisserant@0: etisserant@0: def getInstance(self, id): etisserant@0: return self.body.getContentInstance(id) etisserant@0: etisserant@0: def getRandomInstance(self, exclude): etisserant@0: return self.body.getContentRandomInstance(exclude) etisserant@0: etisserant@0: def getInstanceByName(self, name): etisserant@0: return self.body.getContentInstanceByName(name) etisserant@0: etisserant@0: def removeInstance(self, id): etisserant@0: self.body.removeContentInstance(id) etisserant@0: etisserant@0: def setText(self, text): etisserant@0: self.body.setText(text) etisserant@0: etisserant@0: def getText(self): etisserant@0: return self.body.getText() etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: if "pous_pou" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["pous_pou"] etisserant@0: etisserant@0: setattr(cls, "setBodyType", setBodyType) etisserant@0: setattr(cls, "getBodyType", getBodyType) etisserant@0: setattr(cls, "addInstance", addInstance) etisserant@0: setattr(cls, "getInstances", getInstances) etisserant@0: setattr(cls, "getInstance", getInstance) etisserant@0: setattr(cls, "getRandomInstance", getRandomInstance) etisserant@0: setattr(cls, "getInstanceByName", getInstanceByName) etisserant@0: setattr(cls, "removeInstance", removeInstance) etisserant@0: setattr(cls, "setText", setText) etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: def getVars(self): etisserant@0: vars = [] etisserant@0: reverse_types = {} etisserant@0: for name, value in VarTypes.items(): etisserant@0: reverse_types[value] = name etisserant@0: for varlist in self.interface.getContent(): etisserant@0: vars.append((reverse_types[varlist["name"]], varlist["value"])) etisserant@0: return vars etisserant@0: setattr(cls, "getVars", getVars) etisserant@0: etisserant@0: def setVars(self, vars): etisserant@0: self.interface.setContent([]) etisserant@0: for vartype, varlist in vars: etisserant@0: self.interface.appendContent(VarTypes[vartype], varlist) etisserant@0: setattr(cls, "setVars", setVars) etisserant@0: etisserant@0: def addTransition(self, name, type): etisserant@0: if not self.transitions: etisserant@0: self.addTransitions() etisserant@0: self.transitions.setTransition([]) etisserant@0: transition = PLCOpenClasses["transitions_transition"]() etisserant@0: transition.setName(name) etisserant@0: transition.setBodyType(type) etisserant@0: self.transitions.appendTransition(transition) etisserant@0: setattr(cls, "addTransition", addTransition) etisserant@0: etisserant@0: def getTransition(self, name): etisserant@0: if self.transitions: etisserant@0: for transition in self.transitions.getTransition(): etisserant@0: if transition.getName() == name: etisserant@0: return transition etisserant@0: return None etisserant@0: setattr(cls, "getTransition", getTransition) etisserant@0: etisserant@0: def getTransitionList(self): etisserant@0: if self.transitions: etisserant@0: return self.transitions.getTransition() etisserant@0: return [] etisserant@0: setattr(cls, "getTransitionList", getTransitionList) etisserant@0: etisserant@0: def removeTransition(self, name): etisserant@0: if self.transitions: etisserant@0: transitions = self.transitions.getTransition() etisserant@0: i = 0 etisserant@0: removed = False etisserant@0: while i < len(transitions) and not removed: etisserant@0: if transitions[i].getName() == name: etisserant@0: transitions.removeTransition(i) etisserant@0: removed = True etisserant@0: i += 1 etisserant@0: if not removed: etisserant@0: raise ValueError, "Transition with name %s doesn't exists!"%name etisserant@0: setattr(cls, "removeTransition", removeTransition) etisserant@0: etisserant@0: def addAction(self, name, type): etisserant@0: if not self.actions: etisserant@0: self.addActions() etisserant@0: self.actions.setAction([]) etisserant@0: action = PLCOpenClasses["actions_action"]() etisserant@0: action.setName(name) etisserant@0: action.setBodyType(type) etisserant@0: self.actions.appendAction(action) etisserant@0: setattr(cls, "addAction", addAction) etisserant@0: etisserant@0: def getAction(self, name): etisserant@0: if self.actions: etisserant@0: for action in self.actions.getAction(): etisserant@0: if action.getName() == name: etisserant@0: return action etisserant@0: return None etisserant@0: setattr(cls, "getAction", getAction) etisserant@0: etisserant@0: def getActionList(self): etisserant@0: if self.actions: etisserant@0: return self.actions.getAction() etisserant@0: return [] etisserant@0: setattr(cls, "getActionList", getActionList) etisserant@0: etisserant@0: def removeAction(self, name): etisserant@0: if self.actions: etisserant@0: actions = self.actions.getAction() etisserant@0: i = 0 etisserant@0: removed = False etisserant@0: while i < len(actions) and not removed: etisserant@0: if actions[i].getName() == name: etisserant@0: actions.removeAction(i) etisserant@0: removed = True etisserant@0: i += 1 etisserant@0: if not removed: etisserant@0: raise ValueError, "Action with name %s doesn't exists!"%name etisserant@0: setattr(cls, "removeAction", removeAction) etisserant@0: etisserant@0: if "transitions_transition" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["transitions_transition"] etisserant@0: etisserant@0: setattr(cls, "setBodyType", setBodyType) etisserant@0: setattr(cls, "getBodyType", getBodyType) etisserant@0: setattr(cls, "addInstance", addInstance) etisserant@0: setattr(cls, "getInstances", getInstances) etisserant@0: setattr(cls, "getInstance", getInstance) etisserant@0: setattr(cls, "getRandomInstance", getRandomInstance) etisserant@0: setattr(cls, "getInstanceByName", getInstanceByName) etisserant@0: setattr(cls, "removeInstance", removeInstance) etisserant@0: setattr(cls, "setText", setText) etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: if "actions_action" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["actions_action"] etisserant@0: etisserant@0: setattr(cls, "setBodyType", setBodyType) etisserant@0: setattr(cls, "getBodyType", getBodyType) etisserant@0: setattr(cls, "addInstance", addInstance) etisserant@0: setattr(cls, "getInstances", getInstances) etisserant@0: setattr(cls, "getInstance", getInstance) etisserant@0: setattr(cls, "getRandomInstance", getRandomInstance) etisserant@0: setattr(cls, "getInstanceByName", getInstanceByName) etisserant@0: setattr(cls, "removeInstance", removeInstance) etisserant@0: setattr(cls, "setText", setText) etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: if "body" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["body"] etisserant@0: etisserant@0: def appendContentInstance(self, name, instance): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: self.content["value"].appendContent(name, instance) etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "appendContentInstance", appendContentInstance) etisserant@0: etisserant@0: def getContentInstances(self): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: instances = [] etisserant@0: for element in self.content["value"].getContent(): etisserant@0: instances.append(element["value"]) etisserant@0: return instances etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "getContentInstances", getContentInstances) etisserant@0: etisserant@0: def getContentInstance(self, id): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: for element in self.content["value"].getContent(): etisserant@0: if element["value"].getLocalId() == id: etisserant@0: return element["value"] etisserant@0: return None etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "getContentInstance", getContentInstance) etisserant@0: etisserant@0: def getContentRandomInstance(self, exclude): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: for element in self.content["value"].getContent(): etisserant@0: if element["value"].getLocalId() not in exclude: etisserant@0: return element["value"] etisserant@0: return None etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "getContentRandomInstance", getContentRandomInstance) etisserant@0: etisserant@0: def getContentInstanceByName(self, name): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: for element in self.content["value"].getContent(): etisserant@0: if element["value"].getLocalId() == name: etisserant@0: return element["value"] etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "getContentInstanceByName", getContentInstanceByName) etisserant@0: etisserant@0: def removeContentInstance(self, id): etisserant@0: if self.content["name"] in ["LD","FBD","SFC"]: etisserant@0: i = 0 etisserant@0: removed = False etisserant@0: elements = self.content["value"].getContent() etisserant@0: while i < len(elements) and not removed: etisserant@0: if elements[i]["value"].getLocalId() == id: etisserant@0: self.content["value"].removeContent(i) etisserant@0: removed = True etisserant@0: i += 1 etisserant@0: if not removed: etisserant@0: raise ValueError, "Instance with id %d doesn't exists!"%id etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have instances!"%self.content["name"] etisserant@0: setattr(cls, "removeContentInstance", removeContentInstance) etisserant@0: etisserant@0: def setText(self, text): etisserant@0: if self.content["name"] in ["IL","ST"]: etisserant@0: self.content["value"].setText(text) etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have text!"%self.content["name"] etisserant@0: setattr(cls, "setText", setText) etisserant@0: etisserant@0: def getText(self): etisserant@0: if self.content["name"] in ["IL","ST"]: etisserant@0: return self.content["value"].getText() etisserant@0: else: etisserant@0: raise TypeError, "%s body don't have text!"%self.content["name"] etisserant@0: setattr(cls, "getText", getText) etisserant@0: etisserant@0: def getX(self): etisserant@0: return self.position.getX() etisserant@0: etisserant@0: def getY(self): etisserant@0: return self.position.getY() etisserant@0: etisserant@0: def setX(self, x): etisserant@0: self.position.setX(x) etisserant@0: etisserant@0: def setY(self, y): etisserant@0: self.position.setY(y) etisserant@0: etisserant@0: if "comment" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["comment"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setContentText(self, text): etisserant@0: self.content.setText(text) etisserant@0: setattr(cls, "setContentText", setContentText) etisserant@0: etisserant@0: def getContentText(self): etisserant@0: return self.content.getText() etisserant@0: setattr(cls, "getContentText", getContentText) etisserant@0: etisserant@0: if "block" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["block"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "inputVariables_variable" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["inputVariables_variable"] etisserant@0: etisserant@0: def setConnectorEdge(self, edge): etisserant@0: if not self.edge: etisserant@0: self.edge = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edge.setValue(edge) etisserant@0: setattr(cls, "setConnectorEdge", setConnectorEdge) etisserant@0: etisserant@0: def getConnectorEdge(self): etisserant@0: if self.edge: etisserant@0: return self.edge.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getConnectorEdge", getConnectorEdge) etisserant@0: etisserant@0: if "outputVariables_variable" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["outputVariables_variable"] etisserant@0: etisserant@0: def setConnectorEdge(self, edge): etisserant@0: if not self.edge: etisserant@0: self.edge = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edge.setValue(edge) etisserant@0: setattr(cls, "setConnectorEdge", setConnectorEdge) etisserant@0: etisserant@0: def getConnectorEdge(self): etisserant@0: if self.edge: etisserant@0: return self.edge.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getConnectorEdge", getConnectorEdge) etisserant@0: etisserant@0: if "leftPowerRail" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["leftPowerRail"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "contact" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["contact"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setContactEdge(self, edge): etisserant@0: if not self.edge: etisserant@0: self.edge = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edge.setValue(edge) etisserant@0: setattr(cls, "setContactEdge", setContactEdge) etisserant@0: etisserant@0: def getContactEdge(self): etisserant@0: if self.edge: etisserant@0: return self.edge.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getContactEdge", getContactEdge) etisserant@0: etisserant@0: if "coil" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["coil"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setCoilStorage(self, edge): etisserant@0: if not self.storage: etisserant@0: self.storage = PLCOpenClasses["storageModifierType"]() etisserant@0: self.storage.setValue(edge) etisserant@0: setattr(cls, "setCoilStorage", setCoilStorage) etisserant@0: etisserant@0: def getCoilStorage(self): etisserant@0: if self.storage: etisserant@0: return self.storage.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getCoilStorage", getCoilStorage) etisserant@0: etisserant@0: if "rightPowerRail" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["rightPowerRail"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "step" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["step"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "transition" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["transition"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setConditionContent(self, type, value): etisserant@0: if not self.condition: etisserant@0: self.addCondition() etisserant@0: if type == "reference": etisserant@0: condition = PLCOpenClasses["condition_reference"]() etisserant@0: condition.setName(value) etisserant@0: elif type == "inline": etisserant@0: condition = PLCOpenClasses["condition_inline"]() etisserant@0: condition.setContent("ST", PLCOpenClasses["formattedText"]()) etisserant@0: condition.setText(value) etisserant@0: self.condition.setContent(type, condition) etisserant@0: setattr(cls, "setConditionContent", setConditionContent) etisserant@0: etisserant@0: def getConditionContent(self): etisserant@0: if self.condition: etisserant@0: content = self.condition.getContent() etisserant@0: values = {"type" : content["name"]} etisserant@0: if values["type"] == "reference": etisserant@0: values["value"] = content["value"].getName() etisserant@0: elif values["type"] == "inline": etisserant@0: values["value"] = content["value"].getText() etisserant@0: return values etisserant@0: return "" etisserant@0: setattr(cls, "getConditionContent", getConditionContent) etisserant@0: etisserant@0: if "selectionDivergence" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["selectionDivergence"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "selectionConvergence" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["selectionConvergence"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "simultaneousDivergence" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["simultaneousDivergence"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "simultaneousDivergence" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["simultaneousConvergence"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "jumpStep" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["jumpStep"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "actionBlock_action" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["actionBlock_action"] etisserant@0: etisserant@0: def setQualifierValue(self, value): etisserant@0: if self.qualifier: etisserant@0: self.qualifier.setValue(value) etisserant@0: setattr(cls, "setQualifierValue", setQualifierValue) etisserant@0: etisserant@0: def getQualifierValue(self): etisserant@0: if self.qualifier: etisserant@0: return self.qualifier.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getQualifierValue", getQualifierValue) etisserant@0: etisserant@0: def setReferenceName(self, name): etisserant@0: if self.reference: etisserant@0: self.reference.setName(name) etisserant@0: setattr(cls, "setReferenceName", setReferenceName) etisserant@0: etisserant@0: def getReferenceName(self): etisserant@0: if self.reference: etisserant@0: return self.reference.getName() etisserant@0: return None etisserant@0: setattr(cls, "getReferenceName", getReferenceName) etisserant@0: etisserant@0: def setInlineContent(self, content): etisserant@0: if self.inline: etisserant@0: self.inline.setContent("ST", PLCOpenClasses["formattedText"]()) etisserant@0: self.inline.setText(content) etisserant@0: setattr(cls, "setInlineContent", setInlineContent) etisserant@0: etisserant@0: def getInlineContent(self): etisserant@0: if self.inline: etisserant@0: return self.inline.getText() etisserant@0: return None etisserant@0: setattr(cls, "getInlineContent", getInlineContent) etisserant@0: etisserant@0: if "actionBlock" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["actionBlock"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setActions(self, actions): etisserant@0: self.action = [] etisserant@0: for params in actions: etisserant@0: action = PLCOpenClasses["actionBlock_action"]() etisserant@0: action.addQualifier() etisserant@0: action.setQualifierValue(params["qualifier"]) etisserant@0: if params["type"] == "reference": etisserant@0: action.addReference() etisserant@0: action.setReferenceName(params["value"]) etisserant@0: else: etisserant@0: action.addInline() etisserant@0: action.setInlineContent(params["value"]) etisserant@0: if params["indicator"] != "": etisserant@0: action.setIndicator(params["indicator"]) etisserant@0: if "duration" in params: etisserant@0: action.setDuration(params["duration"]) etisserant@0: self.action.append(action) etisserant@0: setattr(cls, "setActions", setActions) etisserant@0: etisserant@0: def getActions(self): etisserant@0: actions = [] etisserant@0: for action in self.action: etisserant@0: params = {} etisserant@0: params["qualifier"] = action.getQualifierValue() etisserant@0: if action.getReference(): etisserant@0: params["type"] = "reference" etisserant@0: params["value"] = action.getReferenceName() etisserant@0: elif action.getInline(): etisserant@0: params["type"] = "inline" etisserant@0: params["value"] = action.getInlineContent() etisserant@0: duration = action.getDuration() etisserant@0: if duration: etisserant@0: params["duration"] = duration etisserant@0: indicator = action.getIndicator() etisserant@0: if indicator: etisserant@0: params["indicator"] = indicator etisserant@0: else: etisserant@0: params["indicator"] = "" etisserant@0: actions.append(params) etisserant@0: return actions etisserant@0: setattr(cls, "getActions", getActions) etisserant@0: etisserant@0: if "inVariable" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["inVariable"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setConnectorEdge(self, edge): etisserant@0: if not self.edge: etisserant@0: self.edge = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edge.setValue(edge) etisserant@0: setattr(cls, "setConnectorEdge", setConnectorEdge) etisserant@0: etisserant@0: def getConnectorEdge(self): etisserant@0: if self.edge: etisserant@0: return self.edge.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getConnectorEdge", getConnectorEdge) etisserant@0: etisserant@0: if "outVariable" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["outVariable"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setConnectorEdge(self, edge): etisserant@0: if not self.edge: etisserant@0: self.edge = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edge.setValue(edge) etisserant@0: setattr(cls, "setConnectorEdge", setConnectorEdge) etisserant@0: etisserant@0: def getConnectorEdge(self): etisserant@0: if self.edge: etisserant@0: return self.edge.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getConnectorEdge", getConnectorEdge) etisserant@0: etisserant@0: if "inOutVariable" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["inOutVariable"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: def setInputEdge(self, edge): etisserant@0: if not self.edgeIn: etisserant@0: self.edgeIn = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edgeIn.setValue(edge) etisserant@0: setattr(cls, "setInputEdge", setInputEdge) etisserant@0: etisserant@0: def getInputEdge(self): etisserant@0: if self.edgeIn: etisserant@0: return self.edgeIn.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getInputEdge", getInputEdge) etisserant@0: etisserant@0: def setOutputEdge(self, edge): etisserant@0: if not self.edgeOut: etisserant@0: self.edgeOut = PLCOpenClasses["edgeModifierType"]() etisserant@0: self.edgeOut.setValue(edge) etisserant@0: setattr(cls, "setInputEdge", setInputEdge) etisserant@0: etisserant@0: def getOutputEdge(self): etisserant@0: if self.edgeOut: etisserant@0: return self.edgeOut.getValue() etisserant@0: return None etisserant@0: setattr(cls, "getOutputEdge", getOutputEdge) etisserant@0: etisserant@0: if "continuation" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["continuation"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "connector" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["connector"] etisserant@0: setattr(cls, "getX", getX) etisserant@0: setattr(cls, "getY", getY) etisserant@0: setattr(cls, "setX", setX) etisserant@0: setattr(cls, "setY", setY) etisserant@0: etisserant@0: if "connection" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["connection"] etisserant@0: etisserant@0: def setPoints(self, points): etisserant@0: self.position = [] etisserant@0: for point in points: etisserant@0: position = PLCOpenClasses["position"]() etisserant@0: position.setX(point.x) etisserant@0: position.setY(point.y) etisserant@0: self.position.append(position) etisserant@0: setattr(cls, "setPoints", setPoints) etisserant@0: etisserant@0: def getPoints(self): etisserant@0: points = [] etisserant@0: for position in self.position: etisserant@0: points.append((position.getX(),position.getY())) etisserant@0: return points etisserant@0: setattr(cls, "getPoints", getPoints) etisserant@0: etisserant@0: if "connectionPointIn" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["connectionPointIn"] etisserant@0: etisserant@0: def setRelPosition(self, x, y): etisserant@0: self.relPosition = PLCOpenClasses["position"]() etisserant@0: self.relPosition.setX(x) etisserant@0: self.relPosition.setY(y) etisserant@0: setattr(cls, "setRelPosition", setRelPosition) etisserant@0: etisserant@0: def getRelPosition(self): etisserant@0: if self.relPosition: etisserant@0: return self.relPosition.getX(), self.relPosition.getY() etisserant@0: else: etisserant@0: return self.relPosition etisserant@0: setattr(cls, "getRelPosition", getRelPosition) etisserant@0: etisserant@0: def addConnection(self): etisserant@0: if not self.content: etisserant@0: self.content = {"name":"connection","value":[PLCOpenClasses["connection"]()]} etisserant@0: else: etisserant@0: self.content["value"].append(PLCOpenClasses["connection"]()) etisserant@0: setattr(cls, "addConnection", addConnection) etisserant@0: etisserant@0: def removeConnection(self, idx): etisserant@0: if self.content: etisserant@0: self.content["value"].pop(idx) etisserant@0: if len(self.content["value"]) == 0: etisserant@0: self.content = None etisserant@0: setattr(cls, "removeConnection", removeConnection) etisserant@0: etisserant@0: def removeConnections(self): etisserant@0: if self.content: etisserant@0: self.content = None etisserant@0: setattr(cls, "removeConnections", removeConnections) etisserant@0: etisserant@0: def getConnections(self): etisserant@0: if self.content: etisserant@0: return self.content["value"] etisserant@0: setattr(cls, "getConnections", getConnections) etisserant@0: etisserant@0: def setConnectionId(self, idx, id): etisserant@0: if self.content: etisserant@0: self.content["value"][idx].setRefLocalId(id) etisserant@0: setattr(cls, "setConnectionId", setConnectionId) etisserant@0: etisserant@0: def getConnectionId(self, idx): etisserant@0: if self.content: etisserant@0: return self.content["value"][idx].getRefLocalId() etisserant@0: return None etisserant@0: setattr(cls, "getConnectionId", getConnectionId) etisserant@0: etisserant@0: def setConnectionPoints(self, idx, points): etisserant@0: if self.content: etisserant@0: self.content["value"][idx].setPoints(points) etisserant@0: setattr(cls, "setConnectionPoints", setConnectionPoints) etisserant@0: etisserant@0: def getConnectionPoints(self, idx): etisserant@0: if self.content: etisserant@0: return self.content["value"][idx].getPoints() etisserant@0: return None etisserant@0: setattr(cls, "getConnectionPoints", getConnectionPoints) etisserant@0: etisserant@0: if "connectionPointOut" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["connectionPointOut"] etisserant@0: etisserant@0: def setRelPosition(self, x, y): etisserant@0: self.relPosition = PLCOpenClasses["position"]() etisserant@0: self.relPosition.setX(x) etisserant@0: self.relPosition.setY(y) etisserant@0: setattr(cls, "setRelPosition", setRelPosition) etisserant@0: etisserant@0: def getRelPosition(self): etisserant@0: if self.relPosition: etisserant@0: return self.relPosition.getX(), self.relPosition.getY() etisserant@0: return self.relPosition etisserant@0: setattr(cls, "getRelPosition", getRelPosition) etisserant@0: etisserant@0: if "value" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["value"] etisserant@0: etisserant@0: def setValue(self, value): etisserant@0: try: etisserant@0: value = eval(value) etisserant@0: except: etisserant@0: pass etisserant@0: if type(value) == ListType: etisserant@0: arrayValue = PLCOpenClasses["value_arrayValue"]() etisserant@0: arrayValue.setValue(value) etisserant@0: self.content = {"name":"arrayValue","value":arrayValue} etisserant@0: elif type(value) == DictType: etisserant@0: structValue = PLCOpenClasses["value_structValue"]() etisserant@0: structValue.setValue(value) etisserant@0: self.content = {"name":"structValue","value":structValue} etisserant@0: else: etisserant@0: simpleValue = PLCOpenClasses["value_simpleValue"]() etisserant@0: simpleValue.setValue(str(value)) etisserant@0: self.content = {"name":"simpleValue","value":simpleValue} etisserant@0: setattr(cls, "setValue", setValue) etisserant@0: etisserant@0: def getValue(self): etisserant@0: value = self.content["value"].getValue() etisserant@0: try: etisserant@0: value = eval(value) etisserant@0: except: etisserant@0: pass etisserant@0: return value etisserant@0: setattr(cls, "getValue", getValue) etisserant@0: etisserant@0: if "value_arrayValue" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["value_arrayValue"] etisserant@0: etisserant@0: def setValue(self, array): etisserant@0: self.value = [] etisserant@0: for value in array: etisserant@0: element = PLCOpenClasses["arrayValue_value"]() etisserant@0: element.setValue(value) etisserant@0: self.value.append(element) etisserant@0: setattr(cls, "setValue", setValue) etisserant@0: etisserant@0: def getValue(self): etisserant@0: return [element.getValue() for element in self.value] etisserant@0: setattr(cls, "getValue", getValue) etisserant@0: etisserant@0: if "value_structValue" in PLCOpenClasses: etisserant@0: cls = PLCOpenClasses["value_structValue"] etisserant@0: etisserant@0: def setValue(self, dict): etisserant@0: self.value = [] etisserant@0: for name,value in dict.items(): etisserant@0: element = PLCOpenClasses["structValue_value"]() etisserant@0: element.setMember(name) etisserant@0: element.setValue(value) etisserant@0: self.value.append(element) etisserant@0: setattr(cls, "setValue", setValue) etisserant@0: etisserant@0: def getValue(self): etisserant@0: value = {} etisserant@0: for element in self.value: etisserant@0: value[element.getMember()] = element.getValue() etisserant@0: return value etisserant@0: setattr(cls, "getValue", getValue) etisserant@0: etisserant@0: if sys: etisserant@0: sys.stdout = HolePseudoFile() etisserant@0: xsdschema = pyxsval.parseAndValidateXmlSchema("plcopen/TC6_XML_V10_B.xsd") etisserant@0: if sys: etisserant@0: sys.stdout = sys.__stdout__ etisserant@0: Generate_classes(xsdschema.getTree(), None) etisserant@0: etisserant@0: PLCOpenClasses = {} etisserant@0: PLCOpenTypes = {} etisserant@0: #for classname, classe in classes.items(): etisserant@0: # print "%s : %s\n"%(classname, str(classe)) etisserant@0: """classnames = classes.keys() etisserant@0: classnames.sort() etisserant@0: for classname in classnames: etisserant@0: print classname""" etisserant@0: for classe in classes.keys(): etisserant@0: CreateClass(classe) etisserant@0: Generate_Methods()