PLCControler.py
changeset 27 dae55dd9ee14
parent 24 364320323b4d
child 28 fc23e1f415d8
equal deleted inserted replaced
26:36d378bd852e 27:dae55dd9ee14
    21 #You should have received a copy of the GNU General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
    25 from minixsv import pyxsval
    25 from minixsv import pyxsval
       
    26 from xml.dom import minidom
    26 import cPickle
    27 import cPickle
    27 import os,sys,re
    28 import os,sys,re
    28 from datetime import *
    29 from datetime import *
    29 
    30 
    30 from plcopen import plcopen
    31 from plcopen import plcopen
   156         self.LastNewIndex = 0
   157         self.LastNewIndex = 0
   157         self.Reset()
   158         self.Reset()
   158     
   159     
   159     # Reset PLCControler internal variables
   160     # Reset PLCControler internal variables
   160     def Reset(self):
   161     def Reset(self):
       
   162         self.VerifyXML = False
   161         self.Project = None
   163         self.Project = None
   162         self.ProjectBuffer = None
   164         self.ProjectBuffer = None
   163         self.FilePath = ""
   165         self.FilePath = ""
   164         self.FileName = ""
   166         self.FileName = ""
   165         self.ElementsOpened = []
   167         self.ElementsOpened = []
   183     def CreateNewProject(self, name):
   185     def CreateNewProject(self, name):
   184         # Create the project
   186         # Create the project
   185         self.Project = plcopen.project()
   187         self.Project = plcopen.project()
   186         self.Project.setName(name)
   188         self.Project.setName(name)
   187         # Initialize the project buffer
   189         # Initialize the project buffer
   188         self.ProjectBuffer = UndoBuffer(self.Copy(self.Project))
   190         #self.ProjectBuffer = UndoBuffer(self.Copy(self.Project))
   189     
   191     
   190     # Change project name
   192     # Change project name
   191     def SetProjectName(self, name):
   193     def SetProjectName(self, name):
   192         self.Project.setName(name)
   194         self.Project.setName(name)
   193     
   195     
  1052                     connector["edge"] = variable.getConnectorEdge()
  1054                     connector["edge"] = variable.getConnectorEdge()
  1053                     connector["links"] = []
  1055                     connector["links"] = []
  1054                     connections = variable.connectionPointIn.getConnections()
  1056                     connections = variable.connectionPointIn.getConnections()
  1055                     if connections:
  1057                     if connections:
  1056                         for link in connections:
  1058                         for link in connections:
  1057                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1059                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1058                             connector["links"].append(dic)
  1060                             connector["links"].append(dic)
  1059                     infos["connectors"]["inputs"].append(connector)
  1061                     infos["connectors"]["inputs"].append(connector)
  1060                 for variable in instance.outputVariables.getVariable():
  1062                 for variable in instance.outputVariables.getVariable():
  1061                     connector = {}
  1063                     connector = {}
  1062                     connector["position"] = variable.connectionPointOut.getRelPosition()
  1064                     connector["position"] = variable.connectionPointOut.getRelPosition()
  1081                 infos["connector"]["edge"] = instance.getConnectorEdge()
  1083                 infos["connector"]["edge"] = instance.getConnectorEdge()
  1082                 infos["connector"]["links"] = []
  1084                 infos["connector"]["links"] = []
  1083                 connections = instance.connectionPointIn.getConnections()
  1085                 connections = instance.connectionPointIn.getConnections()
  1084                 if connections:
  1086                 if connections:
  1085                     for link in connections:
  1087                     for link in connections:
  1086                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1088                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1087                         infos["connector"]["links"].append(dic)
  1089                         infos["connector"]["links"].append(dic)
  1088             elif isinstance(instance, plcopen.inOutVariable):
  1090             elif isinstance(instance, plcopen.inOutVariable):
  1089                 infos["name"] = instance.getExpression()
  1091                 infos["name"] = instance.getExpression()
  1090                 infos["value_type"] = self.GetPouVarValueType(self.GetCurrentElementEditing(), infos["name"])
  1092                 infos["value_type"] = self.GetPouVarValueType(self.GetCurrentElementEditing(), infos["name"])
  1091                 infos["type"] = "inout"
  1093                 infos["type"] = "inout"
  1098                 infos["connectors"]["input"]["edge"] = instance.getInputEdge()
  1100                 infos["connectors"]["input"]["edge"] = instance.getInputEdge()
  1099                 infos["connectors"]["input"]["links"] = []
  1101                 infos["connectors"]["input"]["links"] = []
  1100                 connections = instance.connectionPointIn.getConnections()
  1102                 connections = instance.connectionPointIn.getConnections()
  1101                 if connections:
  1103                 if connections:
  1102                     for link in connections:
  1104                     for link in connections:
  1103                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1105                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1104                         infos["connectors"]["input"]["links"].append(dic)
  1106                         infos["connectors"]["input"]["links"].append(dic)
  1105             elif isinstance(instance, plcopen.continuation):
  1107             elif isinstance(instance, plcopen.continuation):
  1106                 infos["name"] = instance.getName()
  1108                 infos["name"] = instance.getName()
  1107                 infos["value_type"] = self.GetPouVarValueType(self.GetCurrentElementEditing(), infos["name"])
  1109                 infos["value_type"] = self.GetPouVarValueType(self.GetCurrentElementEditing(), infos["name"])
  1108                 infos["type"] = "continuation"
  1110                 infos["type"] = "continuation"
  1116                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1118                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1117                 infos["connector"]["links"] = []
  1119                 infos["connector"]["links"] = []
  1118                 connections = instance.connectionPointIn.getConnections()
  1120                 connections = instance.connectionPointIn.getConnections()
  1119                 if connections:
  1121                 if connections:
  1120                     for link in connections:
  1122                     for link in connections:
  1121                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1123                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1122                         infos["connector"]["links"].append(dic)
  1124                         infos["connector"]["links"].append(dic)
  1123             elif isinstance(instance, plcopen.comment):
  1125             elif isinstance(instance, plcopen.comment):
  1124                 infos["type"] = "comment"
  1126                 infos["type"] = "comment"
  1125                 infos["content"] = instance.getContentText()
  1127                 infos["content"] = instance.getContentText()
  1126             elif isinstance(instance, plcopen.leftPowerRail):
  1128             elif isinstance(instance, plcopen.leftPowerRail):
  1136                 for connection in instance.getConnectionPointIn():
  1138                 for connection in instance.getConnectionPointIn():
  1137                     connector = {}
  1139                     connector = {}
  1138                     connector["position"] = connection.getRelPosition()
  1140                     connector["position"] = connection.getRelPosition()
  1139                     connector["links"] = []
  1141                     connector["links"] = []
  1140                     for link in connection.getConnections():
  1142                     for link in connection.getConnections():
  1141                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1143                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1142                         connector["links"].append(dic)
  1144                         connector["links"].append(dic)
  1143                     infos["connectors"].append(connector)
  1145                     infos["connectors"].append(connector)
  1144             elif isinstance(instance, plcopen.contact):
  1146             elif isinstance(instance, plcopen.contact):
  1145                 infos["type"] = "contact"
  1147                 infos["type"] = "contact"
  1146                 infos["name"] = instance.getVariable()
  1148                 infos["name"] = instance.getVariable()
  1150                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1152                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1151                 infos["connectors"]["input"]["links"] = []
  1153                 infos["connectors"]["input"]["links"] = []
  1152                 connections = instance.connectionPointIn.getConnections()
  1154                 connections = instance.connectionPointIn.getConnections()
  1153                 if connections:
  1155                 if connections:
  1154                     for link in connections:
  1156                     for link in connections:
  1155                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1157                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1156                         infos["connectors"]["input"]["links"].append(dic)
  1158                         infos["connectors"]["input"]["links"].append(dic)
  1157                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1159                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1158             elif isinstance(instance, plcopen.coil):
  1160             elif isinstance(instance, plcopen.coil):
  1159                 infos["type"] = "coil"
  1161                 infos["type"] = "coil"
  1160                 infos["name"] = instance.getVariable()
  1162                 infos["name"] = instance.getVariable()
  1164                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1166                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1165                 infos["connectors"]["input"]["links"] = []
  1167                 infos["connectors"]["input"]["links"] = []
  1166                 connections = instance.connectionPointIn.getConnections()
  1168                 connections = instance.connectionPointIn.getConnections()
  1167                 if connections:
  1169                 if connections:
  1168                     for link in connections:
  1170                     for link in connections:
  1169                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1171                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1170                         infos["connectors"]["input"]["links"].append(dic)
  1172                         infos["connectors"]["input"]["links"].append(dic)
  1171                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1173                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1172             elif isinstance(instance, plcopen.step):
  1174             elif isinstance(instance, plcopen.step):
  1173                 infos["type"] = "step"
  1175                 infos["type"] = "step"
  1174                 infos["name"] = instance.getName()
  1176                 infos["name"] = instance.getName()
  1179                     infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1181                     infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1180                     infos["connectors"]["input"]["links"] = []
  1182                     infos["connectors"]["input"]["links"] = []
  1181                     connections = instance.connectionPointIn.getConnections()
  1183                     connections = instance.connectionPointIn.getConnections()
  1182                     if connections:
  1184                     if connections:
  1183                         for link in connections:
  1185                         for link in connections:
  1184                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1186                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1185                             infos["connectors"]["input"]["links"].append(dic)
  1187                             infos["connectors"]["input"]["links"].append(dic)
  1186                 if instance.connectionPointOut:
  1188                 if instance.connectionPointOut:
  1187                     infos["connectors"]["output"] = {"position" : instance.connectionPointOut.getRelPosition()}
  1189                     infos["connectors"]["output"] = {"position" : instance.connectionPointOut.getRelPosition()}
  1188                 if instance.connectionPointOutAction:
  1190                 if instance.connectionPointOutAction:
  1189                     infos["connectors"]["action"] = {"position" : instance.connectionPointOutAction.getRelPosition()}
  1191                     infos["connectors"]["action"] = {"position" : instance.connectionPointOutAction.getRelPosition()}
  1196                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1198                 infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition()
  1197                 infos["connectors"]["input"]["links"] = []
  1199                 infos["connectors"]["input"]["links"] = []
  1198                 connections = instance.connectionPointIn.getConnections()
  1200                 connections = instance.connectionPointIn.getConnections()
  1199                 if connections:
  1201                 if connections:
  1200                     for link in connections:
  1202                     for link in connections:
  1201                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1203                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1202                         infos["connectors"]["input"]["links"].append(dic)
  1204                         infos["connectors"]["input"]["links"].append(dic)
  1203                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1205                 infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition()
  1204             elif isinstance(instance, (plcopen.selectionDivergence, plcopen.simultaneousDivergence)):
  1206             elif isinstance(instance, (plcopen.selectionDivergence, plcopen.simultaneousDivergence)):
  1205                 if isinstance(instance, plcopen.selectionDivergence):
  1207                 if isinstance(instance, plcopen.selectionDivergence):
  1206                     infos["type"] = "selectionDivergence"
  1208                     infos["type"] = "selectionDivergence"
  1211                 connector["position"] = instance.connectionPointIn.getRelPosition()
  1213                 connector["position"] = instance.connectionPointIn.getRelPosition()
  1212                 connector["links"] = []
  1214                 connector["links"] = []
  1213                 connections = instance.connectionPointIn.getConnections()
  1215                 connections = instance.connectionPointIn.getConnections()
  1214                 if connections:
  1216                 if connections:
  1215                     for link in connections:
  1217                     for link in connections:
  1216                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1218                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1217                         connector["links"].append(dic)
  1219                         connector["links"].append(dic)
  1218                 infos["connectors"]["inputs"].append(connector)
  1220                 infos["connectors"]["inputs"].append(connector)
  1219                 for sequence in instance.getConnectionPointOut():
  1221                 for sequence in instance.getConnectionPointOut():
  1220                     connector = {}
  1222                     connector = {}
  1221                     connector["position"] = sequence.getRelPosition()
  1223                     connector["position"] = sequence.getRelPosition()
  1231                     connector["position"] = sequence.getRelPosition()
  1233                     connector["position"] = sequence.getRelPosition()
  1232                     connector["links"] = []
  1234                     connector["links"] = []
  1233                     connections = sequence.getConnections()
  1235                     connections = sequence.getConnections()
  1234                     if connections:
  1236                     if connections:
  1235                         for link in connections:
  1237                         for link in connections:
  1236                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1238                             dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1237                             connector["links"].append(dic)
  1239                             connector["links"].append(dic)
  1238                     infos["connectors"]["inputs"].append(connector)
  1240                     infos["connectors"]["inputs"].append(connector)
  1239                 connector = {}
  1241                 connector = {}
  1240                 connector["position"] = instance.connectionPointOut.getRelPosition()
  1242                 connector["position"] = instance.connectionPointOut.getRelPosition()
  1241                 infos["connectors"]["outputs"].append(connector)
  1243                 infos["connectors"]["outputs"].append(connector)
  1246                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1248                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1247                 infos["connector"]["links"] = []
  1249                 infos["connector"]["links"] = []
  1248                 connections = instance.connectionPointIn.getConnections()
  1250                 connections = instance.connectionPointIn.getConnections()
  1249                 if connections:
  1251                 if connections:
  1250                     for link in connections:
  1252                     for link in connections:
  1251                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1253                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1252                         infos["connector"]["links"].append(dic)
  1254                         infos["connector"]["links"].append(dic)
  1253             elif isinstance(instance, plcopen.actionBlock):
  1255             elif isinstance(instance, plcopen.actionBlock):
  1254                 infos["type"] = "actionBlock"
  1256                 infos["type"] = "actionBlock"
  1255                 infos["actions"] = instance.getActions()
  1257                 infos["actions"] = instance.getActions()
  1256                 infos["connector"] = {}
  1258                 infos["connector"] = {}
  1257                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1259                 infos["connector"]["position"] = instance.connectionPointIn.getRelPosition()
  1258                 infos["connector"]["links"] = []
  1260                 infos["connector"]["links"] = []
  1259                 connections = instance.connectionPointIn.getConnections()
  1261                 connections = instance.connectionPointIn.getConnections()
  1260                 if connections:
  1262                 if connections:
  1261                     for link in connections:
  1263                     for link in connections:
  1262                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints()}
  1264                         dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()}
  1263                         infos["connector"]["links"].append(dic)
  1265                         infos["connector"]["links"].append(dic)
  1264             return infos
  1266             return infos
  1265         return False
  1267         return False
  1266     
  1268     
  1267     # Return the variable type of the given pou
  1269     # Return the variable type of the given pou
  1276         wires = connector.GetWires()
  1278         wires = connector.GetWires()
  1277         idx = 0
  1279         idx = 0
  1278         for wire, handle in wires:
  1280         for wire, handle in wires:
  1279             points = wire.GetPoints(handle != 0)
  1281             points = wire.GetPoints(handle != 0)
  1280             if handle == 0:
  1282             if handle == 0:
  1281                 refLocalId = wire.GetConnectedId(-1)
  1283                 result = wire.GetConnectedInfos(-1)
  1282             else:
  1284             else:
  1283                 refLocalId = wire.GetConnectedId(0)
  1285                 result = wire.GetConnectedInfos(0)
  1284             if refLocalId != None:
  1286             if result != None:
       
  1287                 refLocalId, formalParameter = result
  1285                 connection.addConnection()
  1288                 connection.addConnection()
  1286                 connection.setConnectionId(idx, refLocalId)
  1289                 connection.setConnectionId(idx, refLocalId)
  1287                 connection.setConnectionPoints(idx, points)
  1290                 connection.setConnectionPoints(idx, points)
       
  1291                 if formalParameter != "":
       
  1292                     connection.setConnectionParameter(idx, formalParameter)
       
  1293                 else:
       
  1294                     connection.setConnectionParameter(idx, None)
  1288                 idx += 1
  1295                 idx += 1
  1289     
  1296     
  1290     def AddCurrentElementEditingBlock(self, id):
  1297     def AddCurrentElementEditingBlock(self, id):
  1291         block = plcopen.block()
  1298         block = plcopen.block()
  1292         block.setLocalId(id)
  1299         block.setLocalId(id)
  1845             new_instance["Task"] = ""
  1852             new_instance["Task"] = ""
  1846             instances_data.append(new_instance)
  1853             instances_data.append(new_instance)
  1847         return tasks_data, instances_data
  1854         return tasks_data, instances_data
  1848 
  1855 
  1849     def OpenXMLFile(self, filepath):
  1856     def OpenXMLFile(self, filepath):
  1850         if sys:
  1857         if self.VerifyXML:
  1851             sys.stdout = HolePseudoFile()
  1858             if sys:
  1852         tree = pyxsval.parseAndValidate(filepath, os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"))
  1859                 sys.stdout = HolePseudoFile()
  1853         if sys:
  1860             result = pyxsval.parseAndValidate(filepath, os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"))
  1854             sys.stdout = sys.__stdout__
  1861             if sys:
       
  1862                 sys.stdout = sys.__stdout__
       
  1863             tree = result.getTree()
       
  1864         else:
       
  1865             xmlfile = open(filepath, 'r')
       
  1866             tree = minidom.parse(xmlfile)
       
  1867             xmlfile.close()
  1855         
  1868         
  1856         self.Project = plcopen.project()
  1869         self.Project = plcopen.project()
  1857         self.Project.loadXMLTree(tree.getTree().childNodes[0])
  1870         self.Project.loadXMLTree(tree.childNodes[0])
  1858         self.UndoBuffer = UndoBuffer(self.Copy(self.Project), True)
  1871         self.UndoBuffer = UndoBuffer(self.Copy(self.Project), True)
  1859         self.SetFilePath(filepath)
  1872         self.SetFilePath(filepath)
  1860         self.ElementsOpened = []
  1873         self.ElementsOpened = []
  1861         self.CurrentElementEditing = None
  1874         self.CurrentElementEditing = None
  1862         self.RefreshPouUsingTree()
  1875         self.RefreshPouUsingTree()
  1871                       "xmlns:xhtml" : "http://www.w3.org/1999/xhtml",
  1884                       "xmlns:xhtml" : "http://www.w3.org/1999/xhtml",
  1872                       "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance",
  1885                       "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance",
  1873                       "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd"}
  1886                       "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd"}
  1874             text += self.Project.generateXMLText("project", 0, extras)
  1887             text += self.Project.generateXMLText("project", 0, extras)
  1875 
  1888 
  1876             if sys:
  1889             if self.VerifyXML:
  1877                 sys.stdout = HolePseudoFile()
  1890                 if sys:
  1878             pyxsval.parseAndValidateString(text, open(os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"),"r").read())
  1891                     sys.stdout = HolePseudoFile()
  1879             if sys:
  1892                 pyxsval.parseAndValidateString(text, open(os.path.join(sys.path[0], "plcopen/TC6_XML_V10_B.xsd"),"r").read())
  1880                 sys.stdout = sys.__stdout__
  1893                 if sys:
       
  1894                     sys.stdout = sys.__stdout__
  1881             
  1895             
  1882             if filepath:
  1896             if filepath:
  1883                 xmlfile = open(filepath,"w")
  1897                 xmlfile = open(filepath,"w")
  1884             else:
  1898             else:
  1885                 xmlfile = open(self.FilePath,"w")
  1899                 xmlfile = open(self.FilePath,"w")
  1886             xmlfile.write(text)
  1900             xmlfile.write(text)
  1887             xmlfile.close()
  1901             xmlfile.close()
  1888             self.UndoBuffer.CurrentSaved()
  1902             #self.ProjectBuffer.CurrentSaved()
  1889             if filepath:
  1903             if filepath:
  1890                 self.SetFilePath(filepath)
  1904                 self.SetFilePath(filepath)
  1891             return True
  1905             return True
  1892 
  1906 
  1893 #-------------------------------------------------------------------------------
  1907 #-------------------------------------------------------------------------------
  1899     """
  1913     """
  1900     def Copy(self, model):
  1914     def Copy(self, model):
  1901         return cPickle.loads(cPickle.dumps(model))
  1915         return cPickle.loads(cPickle.dumps(model))
  1902 
  1916 
  1903     def BufferProject(self):
  1917     def BufferProject(self):
  1904         self.UndoBuffer.Buffering(self.Copy(self))
  1918         self.ProjectBuffer.Buffering(self.Copy(self))
  1905 
  1919 
  1906     def ProjectIsSaved(self):
  1920     def ProjectIsSaved(self):
  1907         return self.UndoBuffer.IsCurrentSaved()
  1921         return self.ProjectBuffer.IsCurrentSaved()
  1908 
  1922 
  1909     def LoadPrevious(self):
  1923     def LoadPrevious(self):
  1910         self.Project = self.Copy(self.UndoBuffer.Previous())
  1924         self.Project = self.Copy(self.ProjectBuffer.Previous())
  1911         self.RefreshElementsOpened()
  1925         self.RefreshElementsOpened()
  1912     
  1926     
  1913     def LoadNext(self):
  1927     def LoadNext(self):
  1914         self.Project = self.Copy(self.UndoBuffer.Next())
  1928         self.Project = self.Copy(self.ProjectBuffer.Next())
  1915         self.RefreshElementsOpened()
  1929         self.RefreshElementsOpened()
  1916     
  1930     
  1917     def GetBufferState(self):
  1931     def GetBufferState(self):
  1918         first = self.UndoBuffer.IsFirst()
  1932         first = self.ProjectBuffer.IsFirst()
  1919         last = self.UndoBuffer.IsLast()
  1933         last = self.ProjectBuffer.IsLast()
  1920         return not first, not last
  1934         return not first, not last