plcopen/plcopen.py
changeset 58 39cd981ff242
parent 47 2b2f8d88e6d3
child 63 04a02b4b2a57
--- a/plcopen/plcopen.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/plcopen/plcopen.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -106,6 +106,18 @@
             return ind1 + "<%s>%s</%s>\n"%(name, self.text, name)
     setattr(cls, "generateXMLText", generateXMLText)
     
+    def updateElementName(self, old_name, new_name):
+        index = self.text.find(old_name)
+        while index != -1:
+            if index > 0 and (self.text[index - 1].isalnum() or self.text[index - 1] == "_"):
+                index = self.text.find(old_name, index + len(old_name))
+            elif index < len(self.text) - len(old_name) and (self.text[index + len(old_name)].isalnum() or self.text[index + len(old_name)] == "_"):
+                index = self.text.find(old_name, index + len(old_name))
+            else:
+                self.text = self.text[:index] + new_name + self.text[index + len(old_name):]
+                index = self.text.find(old_name, index + len(new_name))
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "project" in PLCOpenClasses:
     cls = PLCOpenClasses["project"]
     cls.singleLineAttributes = False
@@ -233,8 +245,52 @@
                 raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name)
     setattr(cls, "removeConfigurationResource", removeConfigurationResource)
 
+    def updateElementName(self, old_name, new_name):
+        for pou in self.types.getPouElements():
+            pou.updateElementName(old_name, new_name)
+        for configuration in self.instances.configurations.getConfiguration():
+            configuration.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 PLCOpenClasses["project_fileHeader"].singleLineAttributes = False
 
+if "configurations_configuration" in PLCOpenClasses:
+    cls = PLCOpenClasses["configurations_configuration"]
+    
+    def updateElementName(self, old_name, new_name):
+        for resource in self.getResource():
+            resource.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+
+if "configuration_resource" in PLCOpenClasses:
+    cls = PLCOpenClasses["configuration_resource"]
+    
+    def updateElementName(self, old_name, new_name):
+        for instance in self.getPouInstance():
+            instance.updateElementName(old_name, new_name)
+        for task in self.getTask():
+            task.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+if "resource_task" in PLCOpenClasses:
+    cls = PLCOpenClasses["resource_task"]
+    
+    def updateElementName(self, old_name, new_name):
+        if self.single == old_name:
+            self.single = new_name
+        for instance in self.getPouInstance():
+            instance.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+if "pouInstance" in PLCOpenClasses:
+    cls = PLCOpenClasses["pouInstance"]
+    
+    def updateElementName(self, old_name, new_name):
+        if self.type == old_name:
+            self.type = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "project_types" in PLCOpenClasses:
     cls = PLCOpenClasses["project_types"]
 
@@ -425,6 +481,14 @@
                 raise ValueError, "Action with name %s doesn't exists!"%name
     setattr(cls, "removeAction", removeAction)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+        for action in self.getActionList():
+            action.updateElementName(old_name, new_name)
+        for transition in self.getTransitionList():
+            transition.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "transitions_transition" in PLCOpenClasses:
     cls = PLCOpenClasses["transitions_transition"]
 
@@ -439,6 +503,10 @@
     setattr(cls, "setText", setText)
     setattr(cls, "getText", getText)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "actions_action" in PLCOpenClasses:
     cls = PLCOpenClasses["actions_action"]
 
@@ -453,6 +521,10 @@
     setattr(cls, "setText", setText)
     setattr(cls, "getText", getText)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "body" in PLCOpenClasses:
     cls = PLCOpenClasses["body"]
     
@@ -531,6 +603,14 @@
         else:
             raise TypeError, "%s body don't have text!"%self.content["name"]
     setattr(cls, "getText", getText)
+    
+    def updateElementName(self, old_name, new_name):
+        if self.content["name"] in ["IL", "ST"]:
+            self.content["value"].updateElementName(old_name, new_name)
+        else:
+            for element in self.content["value"].getContent():
+                element["value"].updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
 
 def getX(self):
     return self.position.getX()
@@ -558,6 +638,10 @@
     def getContentText(self):
         return self.content.getText()
     setattr(cls, "getContentText", getContentText)
+    
+    def updateElementName(self, old_name, new_name):
+        self.content.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
 
 if "block" in PLCOpenClasses:
     cls = PLCOpenClasses["block"]
@@ -566,6 +650,11 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        if self.typeName == old_name:
+            self.typeName = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inputVariables_variable" in PLCOpenClasses:
     cls = PLCOpenClasses["inputVariables_variable"]
 
@@ -603,6 +692,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "contact" in PLCOpenClasses:
     cls = PLCOpenClasses["contact"]
     setattr(cls, "getX", getX)
@@ -622,6 +715,11 @@
         return None
     setattr(cls, "getContactEdge", getContactEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.variable == old_name:
+            self.variable = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "coil" in PLCOpenClasses:
     cls = PLCOpenClasses["coil"]
     setattr(cls, "getX", getX)
@@ -641,12 +739,21 @@
         return None
     setattr(cls, "getCoilStorage", getCoilStorage)
 
+    def updateElementName(self, old_name, new_name):
+        if self.variable == old_name:
+            self.variable = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "rightPowerRail" in PLCOpenClasses:
     cls = PLCOpenClasses["rightPowerRail"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "step" in PLCOpenClasses:
     cls = PLCOpenClasses["step"]
@@ -655,6 +762,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "transition" in PLCOpenClasses:
     cls = PLCOpenClasses["transition"]
     setattr(cls, "getX", getX)
@@ -687,6 +798,16 @@
         return ""
     setattr(cls, "getConditionContent", getConditionContent)
 
+    def updateElementName(self, old_name, new_name):
+        if self.condition:
+            content = self.condition.getContent()
+            if content["name"] == "reference":
+                if content["value"].getName() == old_name:
+                    content["value"].setName(new_name)
+            elif content["name"] == "inline":
+                content["value"].updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "selectionDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["selectionDivergence"]
     setattr(cls, "getX", getX)
@@ -694,6 +815,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "selectionConvergence" in PLCOpenClasses:
     cls = PLCOpenClasses["selectionConvergence"]
     setattr(cls, "getX", getX)
@@ -701,6 +826,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
     
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "simultaneousDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["simultaneousDivergence"]
     setattr(cls, "getX", getX)
@@ -708,12 +837,20 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
     
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "simultaneousDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["simultaneousConvergence"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "jumpStep" in PLCOpenClasses:
     cls = PLCOpenClasses["jumpStep"]
@@ -721,6 +858,11 @@
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 
 if "actionBlock_action" in PLCOpenClasses:
     cls = PLCOpenClasses["actionBlock_action"]
@@ -759,6 +901,13 @@
         return None
     setattr(cls, "getInlineContent", getInlineContent)
 
+    def updateElementName(self, old_name, new_name):
+        if self.reference and self.reference.getName() == old_name:
+            self.reference.setName(new_name)
+        if self.inline:
+            self.inline.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "actionBlock" in PLCOpenClasses:
     cls = PLCOpenClasses["actionBlock"]
     setattr(cls, "getX", getX)
@@ -806,6 +955,11 @@
         return actions
     setattr(cls, "getActions", getActions)
 
+    def updateElementName(self, old_name, new_name):
+        for action in self.action:
+            action.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["inVariable"]
     setattr(cls, "getX", getX)
@@ -824,6 +978,11 @@
             return self.edge.getValue()
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
+    
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
 
 if "outVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["outVariable"]
@@ -844,6 +1003,11 @@
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inOutVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["inOutVariable"]
     setattr(cls, "getX", getX)
@@ -875,12 +1039,21 @@
         return None
     setattr(cls, "getOutputEdge", getOutputEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "continuation" in PLCOpenClasses:
     cls = PLCOpenClasses["continuation"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "connector" in PLCOpenClasses:
     cls = PLCOpenClasses["connector"]
@@ -888,6 +1061,10 @@
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "connection" in PLCOpenClasses:
     cls = PLCOpenClasses["connection"]