PLCControler.py
changeset 27 dae55dd9ee14
parent 24 364320323b4d
child 28 fc23e1f415d8
--- a/PLCControler.py	Sat Jul 07 11:35:17 2007 +0200
+++ b/PLCControler.py	Mon Jul 09 11:10:14 2007 +0200
@@ -23,6 +23,7 @@
 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from minixsv import pyxsval
+from xml.dom import minidom
 import cPickle
 import os,sys,re
 from datetime import *
@@ -158,6 +159,7 @@
     
     # Reset PLCControler internal variables
     def Reset(self):
+        self.VerifyXML = False
         self.Project = None
         self.ProjectBuffer = None
         self.FilePath = ""
@@ -185,7 +187,7 @@
         self.Project = plcopen.project()
         self.Project.setName(name)
         # Initialize the project buffer
-        self.ProjectBuffer = UndoBuffer(self.Copy(self.Project))
+        #self.ProjectBuffer = UndoBuffer(self.Copy(self.Project))
     
     # Change project name
     def SetProjectName(self, name):
@@ -1054,7 +1056,7 @@
                     connections = variable.connectionPointIn.getConnections()
                     if connections:
                         for link in connections:
-                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                             connector["links"].append(dic)
                     infos["connectors"]["inputs"].append(connector)
                 for variable in instance.outputVariables.getVariable():
@@ -1083,7 +1085,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connector"]["links"].append(dic)
             elif isinstance(instance, plcopen.inOutVariable):
                 infos["name"] = instance.getExpression()
@@ -1100,7 +1102,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connectors"]["input"]["links"].append(dic)
             elif isinstance(instance, plcopen.continuation):
                 infos["name"] = instance.getName()
@@ -1118,7 +1120,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connector"]["links"].append(dic)
             elif isinstance(instance, plcopen.comment):
                 infos["type"] = "comment"
@@ -1138,7 +1140,7 @@
                     connector["position"] = connection.getRelPosition()
                     connector["links"] = []
                     for link in connection.getConnections():
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         connector["links"].append(dic)
                     infos["connectors"].append(connector)
             elif isinstance(instance, plcopen.contact):
@@ -1152,7 +1154,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connectors"]["input"]["links"].append(dic)
                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
             elif isinstance(instance, plcopen.coil):
@@ -1166,7 +1168,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connectors"]["input"]["links"].append(dic)
                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
             elif isinstance(instance, plcopen.step):
@@ -1181,7 +1183,7 @@
                     connections = instance.connectionPointIn.getConnections()
                     if connections:
                         for link in connections:
-                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                             infos["connectors"]["input"]["links"].append(dic)
                 if instance.connectionPointOut:
                     infos["connectors"]["output"] = {"position" : instance.connectionPointOut.getRelPosition()}
@@ -1198,7 +1200,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connectors"]["input"]["links"].append(dic)
                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
             elif isinstance(instance, (plcopen.selectionDivergence, plcopen.simultaneousDivergence)):
@@ -1213,7 +1215,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         connector["links"].append(dic)
                 infos["connectors"]["inputs"].append(connector)
                 for sequence in instance.getConnectionPointOut():
@@ -1233,7 +1235,7 @@
                     connections = sequence.getConnections()
                     if connections:
                         for link in connections:
-                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                            dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                             connector["links"].append(dic)
                     infos["connectors"]["inputs"].append(connector)
                 connector = {}
@@ -1248,7 +1250,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connector"]["links"].append(dic)
             elif isinstance(instance, plcopen.actionBlock):
                 infos["type"] = "actionBlock"
@@ -1259,7 +1261,7 @@
                 connections = instance.connectionPointIn.getConnections()
                 if connections:
                     for link in connections:
-                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
+                        dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
                         infos["connector"]["links"].append(dic)
             return infos
         return False
@@ -1278,13 +1280,18 @@
         for wire, handle in wires:
             points = wire.GetPoints(handle != 0)
             if handle == 0:
-                refLocalId = wire.GetConnectedId(-1)
+                result = wire.GetConnectedInfos(-1)
             else:
-                refLocalId = wire.GetConnectedId(0)
-            if refLocalId != None:
+                result = wire.GetConnectedInfos(0)
+            if result != None:
+                refLocalId, formalParameter = result
                 connection.addConnection()
                 connection.setConnectionId(idx, refLocalId)
                 connection.setConnectionPoints(idx, points)
+                if formalParameter != "":
+                    connection.setConnectionParameter(idx, formalParameter)
+                else:
+                    connection.setConnectionParameter(idx, None)
                 idx += 1
     
     def AddCurrentElementEditingBlock(self, id):
@@ -1847,14 +1854,20 @@
         return tasks_data, instances_data
 
     def OpenXMLFile(self, filepath):
-        if sys:
-            sys.stdout = HolePseudoFile()
-        tree = pyxsval.parseAndValidate(filepath, os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"))
-        if sys:
-            sys.stdout = sys.__stdout__
+        if self.VerifyXML:
+            if sys:
+                sys.stdout = HolePseudoFile()
+            result = pyxsval.parseAndValidate(filepath, os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"))
+            if sys:
+                sys.stdout = sys.__stdout__
+            tree = result.getTree()
+        else:
+            xmlfile = open(filepath, 'r')
+            tree = minidom.parse(xmlfile)
+            xmlfile.close()
         
         self.Project = plcopen.project()
-        self.Project.loadXMLTree(tree.getTree().childNodes[0])
+        self.Project.loadXMLTree(tree.childNodes[0])
         self.UndoBuffer = UndoBuffer(self.Copy(self.Project), True)
         self.SetFilePath(filepath)
         self.ElementsOpened = []
@@ -1873,11 +1886,12 @@
                       "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd"}
             text += self.Project.generateXMLText("project", 0, extras)
 
-            if sys:
-                sys.stdout = HolePseudoFile()
-            pyxsval.parseAndValidateString(text, open(os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"),"r").read())
-            if sys:
-                sys.stdout = sys.__stdout__
+            if self.VerifyXML:
+                if sys:
+                    sys.stdout = HolePseudoFile()
+                pyxsval.parseAndValidateString(text, open(os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"),"r").read())
+                if sys:
+                    sys.stdout = sys.__stdout__
             
             if filepath:
                 xmlfile = open(filepath,"w")
@@ -1885,7 +1899,7 @@
                 xmlfile = open(self.FilePath,"w")
             xmlfile.write(text)
             xmlfile.close()
-            self.UndoBuffer.CurrentSaved()
+            #self.ProjectBuffer.CurrentSaved()
             if filepath:
                 self.SetFilePath(filepath)
             return True
@@ -1901,20 +1915,20 @@
         return cPickle.loads(cPickle.dumps(model))
 
     def BufferProject(self):
-        self.UndoBuffer.Buffering(self.Copy(self))
+        self.ProjectBuffer.Buffering(self.Copy(self))
 
     def ProjectIsSaved(self):
-        return self.UndoBuffer.IsCurrentSaved()
+        return self.ProjectBuffer.IsCurrentSaved()
 
     def LoadPrevious(self):
-        self.Project = self.Copy(self.UndoBuffer.Previous())
+        self.Project = self.Copy(self.ProjectBuffer.Previous())
         self.RefreshElementsOpened()
     
     def LoadNext(self):
-        self.Project = self.Copy(self.UndoBuffer.Next())
+        self.Project = self.Copy(self.ProjectBuffer.Next())
         self.RefreshElementsOpened()
     
     def GetBufferState(self):
-        first = self.UndoBuffer.IsFirst()
-        last = self.UndoBuffer.IsLast()
+        first = self.ProjectBuffer.IsFirst()
+        last = self.ProjectBuffer.IsLast()
         return not first, not last