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: # lbessard@58: #Copyright (C) 2007: 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 lbessard@2: #modify it under the terms of the GNU 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 lbessard@58: #General Public License for more details. etisserant@0: # lbessard@2: #You should have received a copy of the GNU 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: lbessard@2: from xmlclass import * lbessard@67: from types import * lbessard@77: import os 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: 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: lbessard@151: PLCOpenClasses = GenerateClassesFromXSD(os.path.join(os.path.split(__file__)[0], "TC6_XML_V10_B.xsd")) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("formattedText", None) lbessard@67: if cls: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: index = self.text.find(old_name) lbessard@58: while index != -1: lbessard@58: if index > 0 and (self.text[index - 1].isalnum() or self.text[index - 1] == "_"): lbessard@58: index = self.text.find(old_name, index + len(old_name)) lbessard@58: elif index < len(self.text) - len(old_name) and (self.text[index + len(old_name)].isalnum() or self.text[index + len(old_name)] == "_"): lbessard@58: index = self.text.find(old_name, index + len(old_name)) lbessard@58: else: lbessard@58: self.text = self.text[:index] + new_name + self.text[index + len(old_name):] lbessard@58: index = self.text.find(old_name, index + len(new_name)) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("project", None) lbessard@67: if cls: lbessard@2: cls.singleLineAttributes = False lbessard@2: lbessard@151: def setname(self, name): lbessard@151: self.contentHeader.setname(name) lbessard@151: setattr(cls, "setname", setname) lbessard@145: lbessard@151: def getname(self): lbessard@151: return self.contentHeader.getname() lbessard@151: setattr(cls, "getname", getname) lbessard@151: lbessard@151: def getfileHeader(self): lbessard@2: fileheader = {} lbessard@151: fileheader["companyName"] = self.fileHeader.getcompanyName() lbessard@151: if self.fileHeader.getcompanyURL(): lbessard@151: fileheader["companyURL"] = self.fileHeader.getcompanyURL() lbessard@151: fileheader["productName"] = self.fileHeader.getproductName() lbessard@151: fileheader["productVersion"] = self.fileHeader.getproductVersion() lbessard@151: if self.fileHeader.getproductRelease(): lbessard@151: fileheader["productRelease"] = self.fileHeader.getproductRelease() lbessard@151: fileheader["creationDateTime"] = self.fileHeader.getcreationDateTime() lbessard@151: if self.fileHeader.getcontentDescription(): lbessard@151: fileheader["contentDescription"] = self.fileHeader.getcontentDescription() lbessard@2: return fileheader lbessard@151: setattr(cls, "getfileHeader", getfileHeader) lbessard@151: lbessard@151: def setfileHeader(self, fileheader): lbessard@151: self.fileHeader.setcompanyName(fileheader["companyName"]) lbessard@2: if "companyURL" in fileheader: lbessard@151: self.fileHeader.setcompanyURL(fileheader["companyURL"]) lbessard@151: self.fileHeader.setproductName(fileheader["productName"]) lbessard@151: self.fileHeader.setproductVersion(fileheader["productVersion"]) lbessard@2: if "productRelease" in fileheader: lbessard@151: self.fileHeader.setproductRelease(fileheader["productRelease"]) lbessard@151: self.fileHeader.setcreationDateTime(fileheader["creationDateTime"]) lbessard@2: if "contentDescription" in fileheader: lbessard@151: self.fileHeader.setcontentDescription(fileheader["contentDescription"]) lbessard@151: setattr(cls, "setfileHeader", setfileHeader) lbessard@151: lbessard@151: def getcontentHeader(self): lbessard@145: contentheader = {} lbessard@151: contentheader["projectName"] = self.contentHeader.getname() lbessard@151: if self.contentHeader.getversion(): lbessard@151: contentheader["projectVersion"] = self.contentHeader.getversion() lbessard@151: if self.contentHeader.getmodificationDateTime(): lbessard@151: contentheader["modificationDateTime"] = self.contentHeader.getmodificationDateTime() lbessard@151: if self.contentHeader.getorganization(): lbessard@151: contentheader["organization"] = self.contentHeader.getorganization() lbessard@151: if self.contentHeader.getauthor(): lbessard@151: contentheader["authorName"] = self.contentHeader.getauthor() lbessard@151: if self.contentHeader.getlanguage(): lbessard@151: contentheader["language"] = self.contentHeader.getlanguage() lbessard@151: contentheader["pageSize"] = self.contentHeader.getpageSize() lbessard@151: contentheader["scaling"] = self.contentHeader.getscaling() lbessard@145: return contentheader lbessard@151: setattr(cls, "getcontentHeader", getcontentHeader) lbessard@151: lbessard@151: def setcontentHeader(self, contentheader): lbessard@151: self.contentHeader.setname(contentheader["projectName"]) lbessard@145: if "projectVersion" in contentheader: lbessard@151: self.contentHeader.setversion(contentheader["projectVersion"]) lbessard@145: if "modificationDateTime" in contentheader: lbessard@151: self.contentHeader.setmodificationDateTime(contentheader["modificationDateTime"]) lbessard@145: if "organization" in contentheader: lbessard@151: self.contentHeader.setorganization(contentheader["organization"]) lbessard@145: if "authorName" in contentheader: lbessard@151: self.contentHeader.setauthor(contentheader["authorName"]) lbessard@145: if "language" in contentheader: lbessard@151: self.contentHeader.setlanguage(contentheader["language"]) lbessard@151: self.contentHeader.setpageSize(*contentheader["pageSize"]) lbessard@151: self.contentHeader.setscaling(contentheader["scaling"]) lbessard@151: setattr(cls, "setcontentHeader", setcontentHeader) lbessard@151: lbessard@151: def getdataTypes(self): lbessard@151: return self.types.getdataTypeElements() lbessard@151: setattr(cls, "getdataTypes", getdataTypes) lbessard@151: lbessard@151: def getdataType(self, name): lbessard@151: return self.types.getdataTypeElement(name) lbessard@151: setattr(cls, "getdataType", getdataType) lbessard@151: lbessard@151: def appenddataType(self, name): lbessard@151: self.types.appenddataTypeElement(name) lbessard@151: setattr(cls, "appenddataType", appenddataType) lbessard@125: lbessard@151: def insertdataType(self, index, datatype): lbessard@151: self.types.insertdataTypeElement(index, datatype) lbessard@151: setattr(cls, "insertdataType", insertdataType) lbessard@151: lbessard@151: def removedataType(self, name): lbessard@151: self.types.removedataTypeElement(name) lbessard@151: setattr(cls, "removedataType", removedataType) lbessard@151: lbessard@151: def getpous(self): lbessard@151: return self.types.getpouElements() lbessard@151: setattr(cls, "getpous", getpous) lbessard@151: lbessard@151: def getpou(self, name): lbessard@151: return self.types.getpouElement(name) lbessard@151: setattr(cls, "getpou", getpou) lbessard@151: lbessard@151: def appendpou(self, name, pou_type, body_type): lbessard@151: self.types.appendpouElement(name, pou_type, body_type) lbessard@151: setattr(cls, "appendpou", appendpou) etisserant@0: lbessard@151: def insertpou(self, index, pou): lbessard@151: self.types.insertpouElement(index, pou) lbessard@151: setattr(cls, "insertpou", insertpou) lbessard@151: lbessard@151: def removepou(self, name): lbessard@151: self.types.removepouElement(name) lbessard@151: setattr(cls, "removepou", removepou) lbessard@151: lbessard@151: def getconfigurations(self): lbessard@151: configurations = self.instances.configurations.getconfiguration() lbessard@2: if configurations: lbessard@2: return configurations lbessard@2: return [] lbessard@151: setattr(cls, "getconfigurations", getconfigurations) lbessard@151: lbessard@151: def getconfiguration(self, name): lbessard@151: for configuration in self.instances.configurations.getconfiguration(): lbessard@151: if configuration.getname() == name: lbessard@2: return configuration lbessard@2: return None lbessard@151: setattr(cls, "getconfiguration", getconfiguration) lbessard@151: lbessard@151: def addconfiguration(self, name): lbessard@151: for configuration in self.instances.configurations.getconfiguration(): lbessard@151: if configuration.getname() == name: lbessard@2: raise ValueError, "\"%s\" configuration already exists !!!"%name lbessard@2: new_configuration = PLCOpenClasses["configurations_configuration"]() lbessard@151: new_configuration.setname(name) lbessard@151: self.instances.configurations.appendconfiguration(new_configuration) lbessard@151: setattr(cls, "addconfiguration", addconfiguration) lbessard@151: lbessard@151: def removeconfiguration(self, name): lbessard@2: found = False lbessard@151: for idx, configuration in enumerate(self.instances.configurations.getconfiguration()): lbessard@151: if configuration.getname() == name: lbessard@151: self.instances.configurations.removeconfiguration(idx) lbessard@2: found = True lbessard@2: break lbessard@2: if not found: lbessard@2: raise ValueError, "\"%s\" configuration doesn't exist !!!"%name lbessard@151: setattr(cls, "removeconfiguration", removeconfiguration) lbessard@151: lbessard@151: def getconfigurationResource(self, config_name, name): lbessard@151: configuration = self.getconfiguration(config_name) lbessard@2: if configuration: lbessard@151: for resource in configuration.getresource(): lbessard@151: if resource.getname() == name: lbessard@2: return resource lbessard@2: return None lbessard@151: setattr(cls, "getconfigurationResource", getconfigurationResource) lbessard@151: lbessard@151: def addconfigurationResource(self, config_name, name): lbessard@151: configuration = self.getconfiguration(config_name) lbessard@2: if configuration: lbessard@151: for resource in configuration.getresource(): lbessard@151: if resource.getname() == name: lbessard@2: raise ValueError, "\"%s\" resource already exists in \"%s\" configuration !!!"%(name, config_name) lbessard@2: new_resource = PLCOpenClasses["configuration_resource"]() lbessard@151: new_resource.setname(name) lbessard@151: configuration.appendresource(new_resource) lbessard@151: setattr(cls, "addconfigurationResource", addconfigurationResource) lbessard@151: lbessard@151: def removeconfigurationResource(self, config_name, name): lbessard@151: configuration = self.getconfiguration(config_name) lbessard@2: if configuration: etisserant@0: found = False lbessard@151: for idx, resource in enumerate(configuration.getresource()): lbessard@151: if resource.getname() == name: lbessard@151: configuration.removeresource(idx) etisserant@0: found = True etisserant@0: break etisserant@0: if not found: lbessard@2: raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name) lbessard@151: setattr(cls, "removeconfigurationResource", removeconfigurationResource) lbessard@151: lbessard@151: def updateElementName(self, old_name, new_name): lbessard@151: for pou in self.types.getpouElements(): lbessard@58: pou.updateElementName(old_name, new_name) lbessard@151: for configuration in self.instances.configurations.getconfiguration(): lbessard@58: configuration.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("project_fileHeader", None) lbessard@67: if cls: lbessard@67: cls.singleLineAttributes = False lbessard@67: lbessard@145: cls = PLCOpenClasses.get("project_contentHeader", None) lbessard@145: if cls: lbessard@145: cls.singleLineAttributes = False lbessard@145: lbessard@151: def setpageSize(self, width, height): lbessard@151: self.coordinateInfo.setpageSize(width, height) lbessard@151: setattr(cls, "setpageSize", setpageSize) lbessard@151: lbessard@151: def getpageSize(self): lbessard@151: return self.coordinateInfo.getpageSize() lbessard@151: setattr(cls, "getpageSize", getpageSize) lbessard@151: lbessard@151: def setscaling(self, scaling): lbessard@145: for language, (x, y) in scaling.items(): lbessard@151: self.coordinateInfo.setscaling(language, x, y) lbessard@151: setattr(cls, "setscaling", setscaling) lbessard@151: lbessard@151: def getscaling(self): lbessard@145: scaling = {} lbessard@151: scaling["FBD"] = self.coordinateInfo.getscaling("FBD") lbessard@151: scaling["LD"] = self.coordinateInfo.getscaling("LD") lbessard@151: scaling["SFC"] = self.coordinateInfo.getscaling("SFC") lbessard@145: return scaling lbessard@151: setattr(cls, "getscaling", getscaling) lbessard@145: lbessard@145: cls = PLCOpenClasses.get("contentHeader_coordinateInfo", None) lbessard@145: if cls: lbessard@151: def setpageSize(self, width, height): lbessard@145: if width == 0 and height == 0: lbessard@151: self.deletepageSize() lbessard@145: else: lbessard@145: if self.pageSize is None: lbessard@151: self.addpageSize() lbessard@151: self.pageSize.setx(width) lbessard@151: self.pageSize.sety(height) lbessard@151: setattr(cls, "setpageSize", setpageSize) lbessard@151: lbessard@151: def getpageSize(self): lbessard@145: if self.pageSize is not None: lbessard@151: return self.pageSize.getx(), self.pageSize.gety() lbessard@145: return 0, 0 lbessard@151: setattr(cls, "getpageSize", getpageSize) lbessard@151: lbessard@151: def setscaling(self, language, x, y): lbessard@145: if language == "FBD": lbessard@151: self.fbd.scaling.setx(x) lbessard@151: self.fbd.scaling.sety(y) lbessard@145: elif language == "LD": lbessard@151: self.ld.scaling.setx(x) lbessard@151: self.ld.scaling.sety(y) lbessard@145: elif language == "SFC": lbessard@151: self.sfc.scaling.setx(x) lbessard@151: self.sfc.scaling.sety(y) lbessard@151: setattr(cls, "setscaling", setscaling) lbessard@151: lbessard@151: def getscaling(self, language): lbessard@145: if language == "FBD": lbessard@151: return self.fbd.scaling.getx(), self.fbd.scaling.gety() lbessard@145: elif language == "LD": lbessard@151: return self.ld.scaling.getx(), self.ld.scaling.gety() lbessard@145: elif language == "SFC": lbessard@151: return self.sfc.scaling.getx(), self.sfc.scaling.gety() lbessard@145: return 0, 0 lbessard@151: setattr(cls, "getscaling", getscaling) lbessard@145: lbessard@67: cls = PLCOpenClasses.get("configurations_configuration", None) lbessard@67: if cls: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@151: for resource in self.getresource(): lbessard@58: resource.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@58: lbessard@67: cls = PLCOpenClasses.get("configuration_resource", None) lbessard@67: if cls: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: for instance in self.getPouInstance(): lbessard@58: instance.updateElementName(old_name, new_name) lbessard@58: for task in self.getTask(): lbessard@58: task.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("resource_task", None) lbessard@67: if cls: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.single == old_name: lbessard@58: self.single = new_name lbessard@58: for instance in self.getPouInstance(): lbessard@58: instance.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("pouInstance", None) lbessard@67: if cls: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.type == old_name: lbessard@58: self.type = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("project_types", None) lbessard@67: if cls: lbessard@151: def getdataTypeElements(self): lbessard@151: return self.dataTypes.getdataType() lbessard@151: setattr(cls, "getdataTypeElements", getdataTypeElements) lbessard@151: lbessard@151: def getdataTypeElement(self, name): lbessard@151: elements = self.dataTypes.getdataType() lbessard@125: for element in elements: lbessard@151: if element.getname() == name: lbessard@125: return element lbessard@125: return None lbessard@151: setattr(cls, "getdataTypeElement", getdataTypeElement) lbessard@151: lbessard@151: def appenddataTypeElement(self, name): lbessard@151: for element in self.dataTypes.getdataType(): lbessard@151: if element.getname() == name: lbessard@125: raise ValueError, "\"%s\" Data Type already exists !!!"%name lbessard@125: new_datatype = PLCOpenClasses["dataTypes_dataType"]() lbessard@151: new_datatype.setname(name) lbessard@151: new_datatype.baseType.setcontent({"name" : "BOOL", "value" : None}) lbessard@151: self.dataTypes.appenddataType(new_datatype) lbessard@151: setattr(cls, "appenddataTypeElement", appenddataTypeElement) lbessard@125: lbessard@151: def insertdataTypeElement(self, index, dataType): lbessard@151: self.dataTypes.insertdataType(index, dataType) lbessard@151: setattr(cls, "insertdataTypeElement", insertdataTypeElement) lbessard@151: lbessard@151: def removedataTypeElement(self, name): lbessard@125: found = False lbessard@151: for idx, element in enumerate(self.dataTypes.getdataType()): lbessard@151: if element.getname() == name: lbessard@151: self.dataTypes.removedataType(idx) lbessard@125: found = True lbessard@125: break lbessard@125: if not found: lbessard@125: raise ValueError, "\"%s\" Data Type doesn't exist !!!"%name lbessard@151: setattr(cls, "removedataTypeElement", removedataTypeElement) lbessard@151: lbessard@151: def getpouElements(self): lbessard@151: return self.pous.getpou() lbessard@151: setattr(cls, "getpouElements", getpouElements) lbessard@151: lbessard@151: def getpouElement(self, name): lbessard@151: elements = self.pous.getpou() lbessard@2: for element in elements: lbessard@151: if element.getname() == name: lbessard@2: return element lbessard@2: return None lbessard@151: setattr(cls, "getpouElement", getpouElement) lbessard@151: lbessard@151: def appendpouElement(self, name, pou_type, body_type): lbessard@151: for element in self.pous.getpou(): lbessard@151: if element.getname() == name: lbessard@2: raise ValueError, "\"%s\" POU already exists !!!"%name lbessard@2: new_pou = PLCOpenClasses["pous_pou"]() lbessard@151: new_pou.setname(name) lbessard@151: new_pou.setpouType(pou_type) lbessard@151: new_pou.setbody(PLCOpenClasses["body"]()) lbessard@151: new_pou.setbodyType(body_type) lbessard@151: self.pous.appendpou(new_pou) lbessard@151: setattr(cls, "appendpouElement", appendpouElement) lbessard@2: lbessard@151: def insertpouElement(self, index, pou): lbessard@151: self.pous.insertpou(index, pou) lbessard@151: setattr(cls, "insertpouElement", insertpouElement) lbessard@151: lbessard@151: def removepouElement(self, name): lbessard@2: found = False lbessard@151: for idx, element in enumerate(self.pous.getpou()): lbessard@151: if element.getname() == name: lbessard@151: self.pous.removepou(idx) lbessard@2: found = True lbessard@2: break lbessard@2: if not found: lbessard@2: raise ValueError, "\"%s\" POU doesn't exist !!!"%name lbessard@151: setattr(cls, "removepouElement", removepouElement) lbessard@151: lbessard@151: def setbodyType(self, type): lbessard@2: if type == "IL": lbessard@151: self.body.setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()}) lbessard@2: elif type == "ST": lbessard@151: self.body.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()}) lbessard@2: elif type == "LD": lbessard@151: self.body.setcontent({"name" : "LD", "value" : PLCOpenClasses["body_LD"]()}) lbessard@2: elif type == "FBD": lbessard@151: self.body.setcontent({"name" : "FBD", "value" : PLCOpenClasses["body_FBD"]()}) lbessard@2: elif type == "SFC": lbessard@151: self.body.setcontent({"name" : "SFC", "value" : PLCOpenClasses["body_SFC"]()}) lbessard@2: else: lbessard@2: raise ValueError, "%s isn't a valid body type!"%type lbessard@2: lbessard@151: def getbodyType(self): lbessard@151: return self.body.getcontent()["name"] lbessard@151: lbessard@151: def resetexecutionOrder(self): lbessard@151: self.body.resetexecutionOrder() lbessard@151: lbessard@151: def compileexecutionOrder(self): lbessard@151: self.body.compileexecutionOrder() lbessard@151: lbessard@151: def setelementExecutionOrder(self, instance, new_executionOrder): lbessard@151: self.body.setelementExecutionOrder(instance, new_executionOrder) lbessard@151: lbessard@151: def addinstance(self, name, instance): lbessard@151: self.body.appendcontentInstance(name, instance) lbessard@151: lbessard@151: def getinstances(self): lbessard@151: return self.body.getcontentInstances() lbessard@151: lbessard@151: def getinstance(self, id): lbessard@151: return self.body.getcontentInstance(id) lbessard@151: lbessard@151: def getrandomInstance(self, exclude): lbessard@151: return self.body.getcontentRandomInstance(exclude) lbessard@151: lbessard@151: def getinstanceByName(self, name): lbessard@151: return self.body.getcontentInstanceByName(name) lbessard@151: lbessard@151: def removeinstance(self, id): lbessard@151: self.body.removecontentInstance(id) lbessard@151: lbessard@151: def settext(self, text): lbessard@151: self.body.settext(text) lbessard@151: lbessard@151: def gettext(self): lbessard@151: return self.body.gettext() lbessard@151: setattr(cls, "gettext", gettext) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("pous_pou", None) lbessard@67: if cls: lbessard@151: setattr(cls, "setbodyType", setbodyType) lbessard@151: setattr(cls, "getbodyType", getbodyType) lbessard@151: setattr(cls, "resetexecutionOrder", resetexecutionOrder) lbessard@151: setattr(cls, "compileexecutionOrder", compileexecutionOrder) lbessard@151: setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) lbessard@151: setattr(cls, "addinstance", addinstance) lbessard@151: setattr(cls, "getinstances", getinstances) lbessard@151: setattr(cls, "getinstance", getinstance) lbessard@151: setattr(cls, "getrandomInstance", getrandomInstance) lbessard@151: setattr(cls, "getinstanceByName", getinstanceByName) lbessard@151: setattr(cls, "removeinstance", removeinstance) lbessard@151: setattr(cls, "settext", settext) lbessard@151: setattr(cls, "gettext", gettext) lbessard@151: lbessard@151: def getvars(self): lbessard@2: vars = [] lbessard@2: reverse_types = {} lbessard@2: for name, value in VarTypes.items(): lbessard@2: reverse_types[value] = name lbessard@151: for varlist in self.interface.getcontent(): lbessard@2: vars.append((reverse_types[varlist["name"]], varlist["value"])) lbessard@2: return vars lbessard@151: setattr(cls, "getvars", getvars) lbessard@151: lbessard@151: def setvars(self, vars): lbessard@151: self.interface.setcontent([]) lbessard@2: for vartype, varlist in vars: lbessard@151: self.interface.appendcontent({"name" : VarTypes[vartype], "value" : varlist}) lbessard@151: setattr(cls, "setvars", setvars) lbessard@151: lbessard@151: def addpouVar(self, type, name): lbessard@151: content = self.interface.getcontent() lbessard@67: if len(content) == 0 or content[-1]["name"] != "localVars": lbessard@151: content.append({"name" : "localVars", "value" : PLCOpenClasses["interface_localVars"]()}) lbessard@68: else: lbessard@68: varlist = content[-1]["value"] lbessard@151: variables = varlist.getvariable() lbessard@151: if varlist.getconstant() or varlist.getretain() or len(variables) > 0 and variables[0].getaddress(): lbessard@151: content.append({"name" : "localVars", "value" : PLCOpenClasses["interface_localVars"]()}) lbessard@67: var = PLCOpenClasses["varListPlain_variable"]() lbessard@151: var.setname(name) lbessard@67: var_type = PLCOpenClasses["dataType"]() lbessard@151: derived_type = PLCOpenClasses["derivedTypes_derived"]() lbessard@151: derived_type.setname(type) lbessard@151: var_type.setcontent({"name" : "derived", "value" : derived_type}) lbessard@151: var.settype(var_type) lbessard@151: content[-1]["value"].appendvariable(var) lbessard@151: setattr(cls, "addpouVar", addpouVar) lbessard@151: lbessard@151: def changepouVar(self, old_type, old_name, new_type, new_name): lbessard@151: content = self.interface.getcontent() lbessard@94: for varlist in content: lbessard@151: variables = varlist["value"].getvariable() lbessard@94: for var in variables: lbessard@151: if var.getname() == old_name: lbessard@151: vartype_content = var.gettype().getcontent() lbessard@151: if vartype_content["name"] == "derived" and vartype_content["value"].getname() == old_type: lbessard@151: var.setname(new_name) lbessard@151: vartype_content["value"].setname(new_type) lbessard@94: return lbessard@151: setattr(cls, "changepouVar", changepouVar) lbessard@151: lbessard@151: def removepouVar(self, type, name): lbessard@151: content = self.interface.getcontent() lbessard@67: for varlist in content: lbessard@151: variables = varlist["value"].getvariable() lbessard@67: for var in variables: lbessard@151: if var.getname() == name: lbessard@151: vartype_content = var.gettype().getcontent() lbessard@151: if vartype_content["name"] == "derived" and vartype_content["value"].getname() == type: lbessard@67: variables.remove(var) lbessard@67: break lbessard@151: if len(varlist["value"].getvariable()) == 0: lbessard@67: content.remove(varlist) lbessard@67: break lbessard@151: setattr(cls, "removepouVar", removepouVar) lbessard@151: lbessard@151: def hasblock(self, name): lbessard@151: if self.getbodyType() in ["FBD", "LD", "SFC"]: lbessard@151: for instance in self.getinstances(): lbessard@151: if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name: lbessard@68: return True lbessard@89: if self.transitions: lbessard@151: for transition in self.transitions.gettransition(): lbessard@151: result = transition.hasblock(name) lbessard@89: if result: lbessard@89: return result lbessard@89: if self.actions: lbessard@151: for action in self.actions.getaction(): lbessard@151: result = action.hasblock(name) lbessard@89: if result: lbessard@89: return result lbessard@68: return False lbessard@151: setattr(cls, "hasblock", hasblock) lbessard@151: lbessard@151: def addtransition(self, name, type): lbessard@2: if not self.transitions: lbessard@151: self.addtransitions() lbessard@151: self.transitions.settransition([]) lbessard@2: transition = PLCOpenClasses["transitions_transition"]() lbessard@151: transition.setname(name) lbessard@151: transition.setbodyType(type) lbessard@151: self.transitions.appendtransition(transition) lbessard@151: setattr(cls, "addtransition", addtransition) lbessard@151: lbessard@151: def gettransition(self, name): lbessard@2: if self.transitions: lbessard@151: for transition in self.transitions.gettransition(): lbessard@151: if transition.getname() == name: lbessard@2: return transition lbessard@2: return None lbessard@151: setattr(cls, "gettransition", gettransition) lbessard@2: lbessard@151: def gettransitionList(self): lbessard@2: if self.transitions: lbessard@151: return self.transitions.gettransition() lbessard@2: return [] lbessard@151: setattr(cls, "gettransitionList", gettransitionList) lbessard@151: lbessard@151: def removetransition(self, name): lbessard@2: if self.transitions: lbessard@151: transitions = self.transitions.gettransition() lbessard@2: i = 0 lbessard@2: removed = False lbessard@2: while i < len(transitions) and not removed: lbessard@151: if transitions[i].getname() == name: lbessard@46: transitions.pop(i) lbessard@2: removed = True lbessard@2: i += 1 lbessard@2: if not removed: lbessard@2: raise ValueError, "Transition with name %s doesn't exists!"%name lbessard@151: setattr(cls, "removetransition", removetransition) lbessard@151: lbessard@151: def addaction(self, name, type): lbessard@2: if not self.actions: lbessard@151: self.addactions() lbessard@151: self.actions.setaction([]) lbessard@2: action = PLCOpenClasses["actions_action"]() lbessard@151: action.setname(name) lbessard@151: action.setbodyType(type) lbessard@151: self.actions.appendaction(action) lbessard@151: setattr(cls, "addaction", addaction) lbessard@151: lbessard@151: def getaction(self, name): lbessard@2: if self.actions: lbessard@151: for action in self.actions.getaction(): lbessard@151: if action.getname() == name: lbessard@2: return action lbessard@2: return None lbessard@151: setattr(cls, "getaction", getaction) lbessard@151: lbessard@151: def getactionList(self): lbessard@2: if self.actions: lbessard@151: return self.actions.getaction() lbessard@2: return [] lbessard@151: setattr(cls, "getactionList", getactionList) lbessard@2: lbessard@151: def removeaction(self, name): lbessard@2: if self.actions: lbessard@151: actions = self.actions.getaction() lbessard@2: i = 0 lbessard@2: removed = False lbessard@2: while i < len(actions) and not removed: lbessard@151: if actions[i].getname() == name: lbessard@46: actions.pop(i) lbessard@2: removed = True lbessard@2: i += 1 lbessard@2: if not removed: lbessard@2: raise ValueError, "Action with name %s doesn't exists!"%name lbessard@151: setattr(cls, "removeaction", removeaction) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: self.body.updateElementName(old_name, new_name) lbessard@151: for action in self.getactionList(): lbessard@58: action.updateElementName(old_name, new_name) lbessard@151: for transition in self.gettransitionList(): lbessard@58: transition.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("transitions_transition", None) lbessard@67: if cls: lbessard@151: setattr(cls, "setbodyType", setbodyType) lbessard@151: setattr(cls, "getbodyType", getbodyType) lbessard@151: setattr(cls, "resetexecutionOrder", resetexecutionOrder) lbessard@151: setattr(cls, "compileexecutionOrder", compileexecutionOrder) lbessard@151: setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) lbessard@151: setattr(cls, "addinstance", addinstance) lbessard@151: setattr(cls, "getinstances", getinstances) lbessard@151: setattr(cls, "getinstance", getinstance) lbessard@151: setattr(cls, "getrandomInstance", getrandomInstance) lbessard@151: setattr(cls, "getinstanceByName", getinstanceByName) lbessard@151: setattr(cls, "removeinstance", removeinstance) lbessard@151: setattr(cls, "settext", settext) lbessard@151: setattr(cls, "gettext", gettext) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: self.body.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: def hasblock(self, name): lbessard@151: if self.getbodyType() in ["FBD", "LD", "SFC"]: lbessard@151: for instance in self.getinstances(): lbessard@151: if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name: lbessard@68: return True lbessard@68: return False lbessard@151: setattr(cls, "hasblock", hasblock) lbessard@68: lbessard@67: cls = PLCOpenClasses.get("actions_action", None) lbessard@67: if cls: lbessard@151: setattr(cls, "setbodyType", setbodyType) lbessard@151: setattr(cls, "getbodyType", getbodyType) lbessard@151: setattr(cls, "resetexecutionOrder", resetexecutionOrder) lbessard@151: setattr(cls, "compileexecutionOrder", compileexecutionOrder) lbessard@151: setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) lbessard@151: setattr(cls, "addinstance", addinstance) lbessard@151: setattr(cls, "getinstances", getinstances) lbessard@151: setattr(cls, "getinstance", getinstance) lbessard@151: setattr(cls, "getrandomInstance", getrandomInstance) lbessard@151: setattr(cls, "getinstanceByName", getinstanceByName) lbessard@151: setattr(cls, "removeinstance", removeinstance) lbessard@151: setattr(cls, "settext", settext) lbessard@151: setattr(cls, "gettext", gettext) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: self.body.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: def hasblock(self, name): lbessard@151: if self.getbodyType() in ["FBD", "LD", "SFC"]: lbessard@151: for instance in self.getinstances(): lbessard@151: if isinstance(instance, PLCOpenClasses["fbdObjects_block"]) and instance.getinstanceName() == name: lbessard@68: return True lbessard@68: return False lbessard@151: setattr(cls, "hasblock", hasblock) lbessard@68: lbessard@67: cls = PLCOpenClasses.get("body", None) lbessard@67: if cls: lbessard@118: cls.currentExecutionOrderId = 0 lbessard@118: lbessard@151: def resetcurrentExecutionOrderId(self): lbessard@118: self.currentExecutionOrderId = 0 lbessard@151: setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId) lbessard@151: lbessard@151: def getnewExecutionOrderId(self): lbessard@118: self.currentExecutionOrderId += 1 lbessard@118: return self.currentExecutionOrderId lbessard@151: setattr(cls, "getnewExecutionOrderId", getnewExecutionOrderId) lbessard@151: lbessard@151: def resetexecutionOrder(self): lbessard@118: if self.content["name"] == "FBD": lbessard@151: for element in self.content["value"].getcontent(): lbessard@151: if not isinstance(element["value"], (PLCOpenClasses.get("commonObjects_comment", None), lbessard@151: PLCOpenClasses.get("commonObjects_connector", None), lbessard@151: PLCOpenClasses.get("commonObjects_continuation", None))): lbessard@151: element["value"].setexecutionOrderId(0) lbessard@118: else: lbessard@118: raise TypeError, "Can only generate execution order on FBD networks!" lbessard@151: setattr(cls, "resetexecutionOrder", resetexecutionOrder) lbessard@151: lbessard@151: def compileexecutionOrder(self): lbessard@118: if self.content["name"] == "FBD": lbessard@151: self.resetexecutionOrder() lbessard@151: self.resetcurrentExecutionOrderId() lbessard@151: for element in self.content["value"].getcontent(): lbessard@151: if isinstance(element["value"], PLCOpenClasses.get("fbdObjects_outVariable", None)) and element["value"].getExecutionOrderId() == 0: lbessard@151: connections = element["value"].connectionPointIn.getconnections() lbessard@118: if connections and len(connections) == 1: lbessard@151: self.compileelementExecutionOrder(connections[0]) lbessard@151: element["value"].setexecutionOrderId(self.getnewExecutionOrderId()) lbessard@118: else: lbessard@118: raise TypeError, "Can only generate execution order on FBD networks!" lbessard@151: setattr(cls, "compileexecutionOrder", compileexecutionOrder) lbessard@151: lbessard@151: def compileelementExecutionOrder(self, link): lbessard@118: if self.content["name"] == "FBD": lbessard@151: localid = link.getrefLocalId() lbessard@151: instance = self.getcontentInstance(localid) lbessard@151: if isinstance(instance, PLCOpenClasses.get("fbdObjects_block", None)) and instance.getexecutionOrderId() == 0: lbessard@151: for variable in instance.inputVariables.getvariable(): lbessard@151: connections = variable.connectionPointIn.getconnections() lbessard@118: if connections and len(connections) == 1: lbessard@151: self.compileelementExecutionOrder(connections[0]) lbessard@151: instance.setexecutionOrderId(self.getnewExecutionOrderId()) lbessard@151: elif isinstance(instance, PLCOpenClasses.get("commonObjects_continuation", None)) and instance.getexecutionOrderId() == 0: lbessard@151: name = instance.getname() lbessard@151: for tmp_instance in self.getcontentInstances(): lbessard@151: if isinstance(tmp_instance, PLCOpenClasses.get("commonObjects_connector", None)) and tmp_instance.getname() == name and tmp_instance.getexecutionOrderId() == 0: lbessard@151: connections = tmp_instance.connectionPointIn.getconnections() lbessard@118: if connections and len(connections) == 1: lbessard@151: self.compileelementExecutionOrder(connections[0]) lbessard@118: else: lbessard@118: raise TypeError, "Can only generate execution order on FBD networks!" lbessard@151: setattr(cls, "compileelementExecutionOrder", compileelementExecutionOrder) lbessard@151: lbessard@151: def setelementExecutionOrder(self, instance, new_executionOrder): lbessard@118: if self.content["name"] == "FBD": lbessard@151: old_executionOrder = instance.getexecutionOrderId() lbessard@118: if old_executionOrder is not None and old_executionOrder != 0 and new_executionOrder != 0: lbessard@151: for element in self.content["value"].getcontent(): lbessard@151: if element["value"] != instance and not isinstance(element["value"], PLCOpenClasses.get("commonObjects_comment", None)): lbessard@151: element_executionOrder = element["value"].getexecutionOrderId() lbessard@118: if old_executionOrder <= element_executionOrder <= new_executionOrder: lbessard@151: element["value"].setexecutionOrderId(element_executionOrder - 1) lbessard@118: if new_executionOrder <= element_executionOrder <= old_executionOrder: lbessard@151: element["value"].setexecutionOrderId(element_executionOrder + 1) lbessard@151: instance.setexecutionOrderId(new_executionOrder) lbessard@118: else: lbessard@118: raise TypeError, "Can only generate execution order on FBD networks!" lbessard@151: setattr(cls, "setelementExecutionOrder", setelementExecutionOrder) lbessard@151: lbessard@151: def appendcontentInstance(self, name, instance): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@151: self.content["value"].appendcontent({"name" : name, "value" : instance}) lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "appendcontentInstance", appendcontentInstance) lbessard@151: lbessard@151: def getcontentInstances(self): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@2: instances = [] lbessard@151: for element in self.content["value"].getcontent(): lbessard@2: instances.append(element["value"]) lbessard@2: return instances lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "getcontentInstances", getcontentInstances) lbessard@151: lbessard@151: def getcontentInstance(self, id): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@151: for element in self.content["value"].getcontent(): lbessard@151: if element["value"].getlocalId() == id: lbessard@2: return element["value"] etisserant@0: return None lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "getcontentInstance", getcontentInstance) lbessard@151: lbessard@151: def getcontentRandomInstance(self, exclude): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@151: for element in self.content["value"].getcontent(): lbessard@151: if element["value"].getlocalId() not in exclude: lbessard@2: return element["value"] lbessard@2: return None lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "getcontentRandomInstance", getcontentRandomInstance) lbessard@151: lbessard@151: def getcontentInstanceByName(self, name): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@151: for element in self.content["value"].getcontent(): lbessard@2: if element["value"].getLocalId() == name: lbessard@2: return element["value"] lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "getcontentInstanceByName", getcontentInstanceByName) lbessard@151: lbessard@151: def removecontentInstance(self, id): lbessard@2: if self.content["name"] in ["LD","FBD","SFC"]: lbessard@2: i = 0 lbessard@2: removed = False lbessard@151: elements = self.content["value"].getcontent() lbessard@2: while i < len(elements) and not removed: lbessard@151: if elements[i]["value"].getlocalId() == id: lbessard@151: self.content["value"].removecontent(i) lbessard@2: removed = True lbessard@2: i += 1 lbessard@2: if not removed: lbessard@2: raise ValueError, "Instance with id %d doesn't exists!"%id lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have instances!"%self.content["name"] lbessard@151: setattr(cls, "removecontentInstance", removecontentInstance) lbessard@151: lbessard@151: def settext(self, text): lbessard@2: if self.content["name"] in ["IL","ST"]: lbessard@151: self.content["value"].settext(text) lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have text!"%self.content["name"] lbessard@151: setattr(cls, "settext", settext) lbessard@151: lbessard@151: def gettext(self): lbessard@2: if self.content["name"] in ["IL","ST"]: lbessard@151: return self.content["value"].gettext() lbessard@2: else: lbessard@2: raise TypeError, "%s body don't have text!"%self.content["name"] lbessard@151: setattr(cls, "gettext", gettext) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.content["name"] in ["IL", "ST"]: lbessard@58: self.content["value"].updateElementName(old_name, new_name) lbessard@58: else: lbessard@151: for element in self.content["value"].getcontent(): lbessard@58: element["value"].updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: def getx(self): lbessard@151: return self.position.getx() lbessard@151: lbessard@151: def gety(self): lbessard@151: return self.position.gety() lbessard@151: lbessard@151: def setx(self, x): lbessard@151: self.position.setx(x) lbessard@151: lbessard@151: def sety(self, y): lbessard@151: self.position.sety(y) lbessard@151: lbessard@151: cls = PLCOpenClasses.get("commonObjects_comment", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@151: lbessard@151: def setcontentText(self, text): lbessard@151: self.content.settext(text) lbessard@151: setattr(cls, "setcontentText", setcontentText) etisserant@0: lbessard@151: def getcontentText(self): lbessard@151: return self.content.gettext() lbessard@151: setattr(cls, "getcontentText", getcontentText) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: self.content.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: cls = PLCOpenClasses.get("fbdObjects_block", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.typeName == old_name: lbessard@58: self.typeName = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("ldObjects_leftPowerRail", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("ldObjects_rightPowerRail", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@67: lbessard@67: def updateElementName(self, old_name, new_name): lbessard@67: pass lbessard@67: setattr(cls, "updateElementName", updateElementName) lbessard@67: lbessard@151: cls = PLCOpenClasses.get("ldObjects_contact", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.variable == old_name: lbessard@58: self.variable = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("ldObjects_coil", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.variable == old_name: lbessard@58: self.variable = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_step", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@67: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_transition", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@151: lbessard@151: def setconditionContent(self, type, value): lbessard@2: if not self.condition: lbessard@151: self.addcondition() lbessard@2: if type == "reference": lbessard@2: condition = PLCOpenClasses["condition_reference"]() lbessard@151: condition.setname(value) lbessard@2: elif type == "inline": lbessard@2: condition = PLCOpenClasses["condition_inline"]() lbessard@151: condition.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()}) lbessard@151: condition.settext(value) lbessard@69: elif type == "connection": lbessard@69: condition = [] lbessard@151: self.condition.setcontent({"name" : type, "value" : condition}) lbessard@151: setattr(cls, "setconditionContent", setconditionContent) etisserant@0: lbessard@151: def getconditionContent(self): lbessard@2: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@2: values = {"type" : content["name"]} lbessard@2: if values["type"] == "reference": lbessard@151: values["value"] = content["value"].getname() lbessard@2: elif values["type"] == "inline": lbessard@151: values["value"] = content["value"].gettext() lbessard@2: return values lbessard@2: return "" lbessard@151: setattr(cls, "getconditionContent", getconditionContent) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@58: if content["name"] == "reference": lbessard@151: if content["value"].getname() == old_name: lbessard@151: content["value"].setname(new_name) lbessard@58: elif content["name"] == "inline": lbessard@58: content["value"].updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: def addconnection(self): lbessard@69: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@69: if content["name"] != "connection": lbessard@151: self.condition.setcontent({"name" : "connection", "value" : []}) lbessard@151: content = self.condition.getcontent() lbessard@69: content["value"].append(PLCOpenClasses["connection"]()) lbessard@151: setattr(cls, "addconnection", addconnection) lbessard@151: lbessard@151: def removeconnection(self, idx): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@63: content["value"].pop(idx) lbessard@151: setattr(cls, "removeconnection", removeconnection) lbessard@151: lbessard@151: def removeconnections(self): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@63: content["value"] = [] lbessard@151: setattr(cls, "removeconnections", removeconnections) lbessard@151: lbessard@151: def getconnections(self): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@63: return content["value"] lbessard@151: setattr(cls, "getconnections", getconnections) lbessard@151: lbessard@151: def setconnectionId(self, idx, id): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: content["value"][idx].setrefLocalId(id) lbessard@151: setattr(cls, "setconnectionId", setconnectionId) lbessard@151: lbessard@151: def getconnectionId(self, idx): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: return content["value"][idx].getrefLocalId() lbessard@63: return None lbessard@151: setattr(cls, "getconnectionId", getconnectionId) lbessard@151: lbessard@151: def setconnectionPoints(self, idx, points): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: content["value"][idx].setpoints(points) lbessard@151: setattr(cls, "setconnectionPoints", setconnectionPoints) lbessard@151: lbessard@151: def getconnectionPoints(self, idx): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: return content["value"][idx].getpoints() lbessard@63: return None lbessard@151: setattr(cls, "getconnectionPoints", getconnectionPoints) lbessard@151: lbessard@151: def setconnectionParameter(self, idx, parameter): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: content["value"][idx].setformalParameter(parameter) lbessard@151: setattr(cls, "setconnectionParameter", setconnectionParameter) lbessard@151: lbessard@151: def getconnectionParameter(self, idx): lbessard@63: if self.condition: lbessard@151: content = self.condition.getcontent() lbessard@63: if content["name"] == "connection": lbessard@151: return content["value"][idx].getformalParameter() lbessard@63: return None lbessard@151: setattr(cls, "getconnectionParameter", getconnectionParameter) lbessard@151: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_selectionDivergence", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_selectionConvergence", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_simultaneousDivergence", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_simultaneousConvergence", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: cls = PLCOpenClasses.get("sfcObjects_jumpStep", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@67: cls = PLCOpenClasses.get("actionBlock_action", None) lbessard@67: if cls: lbessard@151: def setreferenceName(self, name): lbessard@151: if self.reference: lbessard@151: self.reference.setname(name) lbessard@151: setattr(cls, "setreferenceName", setreferenceName) lbessard@151: lbessard@151: def getreferenceName(self): lbessard@151: if self.reference: lbessard@151: return self.reference.getname() lbessard@2: return None lbessard@151: setattr(cls, "getreferenceName", getreferenceName) lbessard@151: lbessard@151: def setinlineContent(self, content): lbessard@151: if self.inline: lbessard@151: self.inline.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()}) lbessard@151: self.inline.settext(content) lbessard@151: setattr(cls, "setinlineContent", setinlineContent) lbessard@151: lbessard@151: def getinlineContent(self): lbessard@151: if self.inline: lbessard@151: return self.inline.gettext() lbessard@2: return None lbessard@151: setattr(cls, "getinlineContent", getinlineContent) lbessard@151: lbessard@151: def updateElementName(self, old_name, new_name): lbessard@151: if self.reference and self.reference.getname() == old_name: lbessard@151: self.reference.setname(new_name) lbessard@58: if self.inline: lbessard@58: self.inline.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("commonObjects_actionBlock", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@151: lbessard@151: def setactions(self, actions): lbessard@2: self.action = [] lbessard@2: for params in actions: lbessard@2: action = PLCOpenClasses["actionBlock_action"]() lbessard@151: action.setqualifier(params["qualifier"]) lbessard@2: if params["type"] == "reference": lbessard@151: action.addreference() lbessard@151: action.setreferenceName(params["value"]) etisserant@0: else: lbessard@151: action.addinline() lbessard@151: action.setinlineContent(params["value"]) lbessard@2: if "duration" in params: lbessard@151: action.setduration(params["duration"]) lbessard@2: if "indicator" in params: lbessard@151: action.setindicator(params["indicator"]) lbessard@2: self.action.append(action) lbessard@151: setattr(cls, "setactions", setactions) lbessard@151: lbessard@151: def getactions(self): lbessard@2: actions = [] lbessard@2: for action in self.action: lbessard@2: params = {} lbessard@151: params["qualifier"] = action.getqualifier() lbessard@108: if params["qualifier"] is None: lbessard@108: params["qualifier"] = "N" lbessard@151: if action.getreference(): lbessard@2: params["type"] = "reference" lbessard@151: params["value"] = action.getreferenceName() lbessard@151: elif action.getinline(): lbessard@2: params["type"] = "inline" lbessard@151: params["value"] = action.getinlineContent() lbessard@151: duration = action.getduration() lbessard@2: if duration: lbessard@2: params["duration"] = duration lbessard@151: indicator = action.getindicator() lbessard@2: if indicator: lbessard@2: params["indicator"] = indicator lbessard@2: actions.append(params) lbessard@2: return actions lbessard@151: setattr(cls, "getactions", getactions) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: for action in self.action: lbessard@58: action.updateElementName(old_name, new_name) lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("fbdObjects_inVariable", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.expression == old_name: lbessard@58: self.expression = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: cls = PLCOpenClasses.get("fbdObjects_outVariable", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.expression == old_name: lbessard@58: self.expression = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("fbdObjects_inOutVariable", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@2: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: if self.expression == old_name: lbessard@58: self.expression = new_name lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@58: lbessard@151: cls = PLCOpenClasses.get("commonObjects_continuation", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@151: cls = PLCOpenClasses.get("commonObjects_connector", None) lbessard@151: if cls: lbessard@151: setattr(cls, "getx", getx) lbessard@151: setattr(cls, "gety", gety) lbessard@151: setattr(cls, "setx", setx) lbessard@151: setattr(cls, "sety", sety) lbessard@58: lbessard@58: def updateElementName(self, old_name, new_name): lbessard@58: pass lbessard@58: setattr(cls, "updateElementName", updateElementName) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("connection", None) lbessard@67: if cls: lbessard@151: def setpoints(self, points): lbessard@2: self.position = [] lbessard@2: for point in points: lbessard@2: position = PLCOpenClasses["position"]() lbessard@151: position.setx(point.x) lbessard@151: position.sety(point.y) lbessard@2: self.position.append(position) lbessard@151: setattr(cls, "setpoints", setpoints) lbessard@151: lbessard@151: def getpoints(self): lbessard@2: points = [] lbessard@2: for position in self.position: lbessard@151: points.append((position.getx(),position.gety())) lbessard@2: return points lbessard@151: setattr(cls, "getpoints", getpoints) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("connectionPointIn", None) lbessard@67: if cls: lbessard@151: def setrelPositionXY(self, x, y): lbessard@2: self.relPosition = PLCOpenClasses["position"]() lbessard@151: self.relPosition.setx(x) lbessard@151: self.relPosition.sety(y) lbessard@151: setattr(cls, "setrelPositionXY", setrelPositionXY) lbessard@151: lbessard@151: def getrelPositionXY(self): lbessard@2: if self.relPosition: lbessard@151: return self.relPosition.getx(), self.relPosition.gety() lbessard@2: else: etisserant@0: return self.relPosition lbessard@151: setattr(cls, "getrelPositionXY", getrelPositionXY) lbessard@151: lbessard@151: def addconnection(self): lbessard@2: if not self.content: lbessard@151: self.content = {"name" : "connection", "value" : [PLCOpenClasses["connection"]()]} lbessard@2: else: lbessard@2: self.content["value"].append(PLCOpenClasses["connection"]()) lbessard@151: setattr(cls, "addconnection", addconnection) lbessard@151: lbessard@151: def removeconnection(self, idx): lbessard@2: if self.content: lbessard@2: self.content["value"].pop(idx) lbessard@2: if len(self.content["value"]) == 0: lbessard@2: self.content = None lbessard@151: setattr(cls, "removeconnection", removeconnection) lbessard@151: lbessard@151: def removeconnections(self): lbessard@2: if self.content: lbessard@2: self.content = None lbessard@151: setattr(cls, "removeconnections", removeconnections) lbessard@151: lbessard@151: def getconnections(self): lbessard@2: if self.content: lbessard@2: return self.content["value"] lbessard@151: setattr(cls, "getconnections", getconnections) lbessard@151: lbessard@151: def setconnectionId(self, idx, id): lbessard@2: if self.content: lbessard@151: self.content["value"][idx].setrefLocalId(id) lbessard@151: setattr(cls, "setconnectionId", setconnectionId) lbessard@151: lbessard@151: def getconnectionId(self, idx): lbessard@2: if self.content: lbessard@151: return self.content["value"][idx].getrefLocalId() lbessard@2: return None lbessard@151: setattr(cls, "getconnectionId", getconnectionId) lbessard@151: lbessard@151: def setconnectionPoints(self, idx, points): lbessard@2: if self.content: lbessard@151: self.content["value"][idx].setpoints(points) lbessard@151: setattr(cls, "setconnectionPoints", setconnectionPoints) lbessard@151: lbessard@151: def getconnectionPoints(self, idx): lbessard@2: if self.content: lbessard@151: return self.content["value"][idx].getpoints() lbessard@2: return None lbessard@151: setattr(cls, "getconnectionPoints", getconnectionPoints) lbessard@151: lbessard@151: def setconnectionParameter(self, idx, parameter): lbessard@27: if self.content: lbessard@151: self.content["value"][idx].setformalParameter(parameter) lbessard@151: setattr(cls, "setconnectionParameter", setconnectionParameter) lbessard@151: lbessard@151: def getconnectionParameter(self, idx): lbessard@27: if self.content: lbessard@151: return self.content["value"][idx].getformalParameter() lbessard@27: return None lbessard@151: setattr(cls, "getconnectionParameter", getconnectionParameter) lbessard@27: lbessard@67: cls = PLCOpenClasses.get("connectionPointOut", None) lbessard@67: if cls: lbessard@151: def setrelPositionXY(self, x, y): lbessard@2: self.relPosition = PLCOpenClasses["position"]() lbessard@151: self.relPosition.setx(x) lbessard@151: self.relPosition.sety(y) lbessard@151: setattr(cls, "setrelPositionXY", setrelPositionXY) lbessard@151: lbessard@151: def getrelPositionXY(self): lbessard@2: if self.relPosition: lbessard@151: return self.relPosition.getx(), self.relPosition.gety() lbessard@2: return self.relPosition lbessard@151: setattr(cls, "getrelPositionXY", getrelPositionXY) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("value", None) lbessard@67: if cls: lbessard@151: def setvalue(self, value): lbessard@125: if value.startswith("[") and value.endswith("]"): lbessard@2: arrayValue = PLCOpenClasses["value_arrayValue"]() lbessard@151: self.content = {"name" : "arrayValue", "value" : arrayValue} lbessard@125: elif value.startswith("(") and value.endswith(")"): lbessard@2: structValue = PLCOpenClasses["value_structValue"]() lbessard@151: self.content = {"name" : "structValue", "value" : structValue} lbessard@2: else: lbessard@2: simpleValue = PLCOpenClasses["value_simpleValue"]() lbessard@151: self.content = {"name" : "simpleValue", "value": simpleValue} lbessard@151: self.content["value"].setvalue(value) lbessard@151: setattr(cls, "setvalue", setvalue) lbessard@151: lbessard@151: def getvalue(self): lbessard@151: return self.content["value"].getvalue() lbessard@151: setattr(cls, "getvalue", getvalue) lbessard@2: lbessard@147: def extractValues(values): lbessard@145: items = values.split(",") lbessard@145: i = 1 lbessard@145: while i < len(items): lbessard@145: opened = items[i - 1].count("(") + items[i - 1].count("[") lbessard@145: closed = items[i - 1].count(")") + items[i - 1].count("]") lbessard@145: if opened > closed: lbessard@145: items[i - 1] = ','.join([items[i - 1], items.pop(i)]) lbessard@145: elif opened == closed: lbessard@145: i += 1 lbessard@145: else: lbessard@145: raise ValueError, "\"%s\" is an invalid value!"%value lbessard@145: return items lbessard@145: lbessard@67: cls = PLCOpenClasses.get("value_arrayValue", None) lbessard@67: if cls: lbessard@145: arrayValue_model = re.compile("([0-9]*)\((.*)\)$") lbessard@125: lbessard@151: def setvalue(self, value): lbessard@2: self.value = [] lbessard@145: for item in extractValues(value[1:-1]): lbessard@125: item = item.strip() lbessard@2: element = PLCOpenClasses["arrayValue_value"]() lbessard@125: result = arrayValue_model.match(item) lbessard@125: if result is not None: lbessard@125: groups = result.groups() lbessard@151: element.setrepetitionValue(int(groups[0])) lbessard@151: element.setvalue(groups[1].strip()) lbessard@125: else: lbessard@151: element.setvalue(item) lbessard@2: self.value.append(element) lbessard@151: setattr(cls, "setvalue", setvalue) lbessard@151: lbessard@151: def getvalue(self): lbessard@125: values = [] lbessard@125: for element in self.value: lbessard@151: repetition = element.getrepetitionValue() lbessard@125: if repetition is not None and repetition > 1: lbessard@151: values.append("%d(%s)"%(repetition, element.getvalue())) lbessard@125: else: lbessard@151: values.append(element.getvalue()) lbessard@125: return "[%s]"%", ".join(values) lbessard@151: setattr(cls, "getvalue", getvalue) lbessard@2: lbessard@67: cls = PLCOpenClasses.get("value_structValue", None) lbessard@67: if cls: lbessard@125: structValue_model = re.compile("(.*):=(.*)") lbessard@125: lbessard@151: def setvalue(self, value): lbessard@2: self.value = [] lbessard@145: for item in extractValues(value[1:-1]): lbessard@125: result = arrayValue_model.match(item) lbessard@125: if result is not None: lbessard@125: groups = result.groups() lbessard@125: element = PLCOpenClasses["structValue_value"]() lbessard@151: element.setmember(groups[0].strip()) lbessard@151: element.setvalue(groups[1].strip()) lbessard@2: self.value.append(element) lbessard@151: setattr(cls, "setvalue", setvalue) lbessard@151: lbessard@151: def getvalue(self): lbessard@125: values = [] lbessard@2: for element in self.value: lbessard@151: values.append("%s := %s"%(element.getmember(), element.getvalue())) lbessard@125: return "(%s)"%", ".join(values) lbessard@151: setattr(cls, "getvalue", getvalue)