Fixed 'python shell' failure from runtime tray icon menu in some case, when PLC init failed
import os
from PLCControler import UndoBuffer
from PythonEditor import PythonEditor
from xml.dom import minidom
from xmlclass import *
import cPickle
PythonClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "py_ext_xsd.xsd"))
class PythonFileCTNMixin:
EditorType = PythonEditor
def __init__(self):
filepath = self.PythonFileName()
self.PythonCode = PythonClasses["Python"]()
if os.path.isfile(filepath):
xmlfile = open(filepath, 'r')
tree = minidom.parse(xmlfile)
xmlfile.close()
for child in tree.childNodes:
if child.nodeType == tree.ELEMENT_NODE and child.nodeName == "Python":
self.PythonCode.loadXMLTree(child, ["xmlns", "xmlns:xsi", "xsi:schemaLocation"])
self.CreatePythonBuffer(True)
else:
self.CreatePythonBuffer(False)
self.OnCTNSave()
def PythonFileName(self):
return os.path.join(self.CTNPath(), "py_ext.xml")
def GetFilename(self):
if self.PythonBuffer.IsCurrentSaved():
return "py_ext"
else:
return "~py_ext~"
def SetPythonCode(self, text):
self.PythonCode.settext(text)
def GetPythonCode(self):
return self.PythonCode.gettext()
def CTNTestModified(self):
return self.ChangesToSave or not self.PythonIsSaved()
def OnCTNSave(self):
filepath = self.PythonFileName()
text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
extras = {"xmlns":"http://www.w3.org/2001/XMLSchema",
"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation" : "py_ext_xsd.xsd"}
text += self.PythonCode.generateXMLText("Python", 0, extras)
xmlfile = open(filepath,"w")
xmlfile.write(text.encode("utf-8"))
xmlfile.close()
self.MarkPythonAsSaved()
return True
#-------------------------------------------------------------------------------
# Current Buffering Management Functions
#-------------------------------------------------------------------------------
"""
Return a copy of the project
"""
def Copy(self, model):
return cPickle.loads(cPickle.dumps(model))
def CreatePythonBuffer(self, saved):
self.Buffering = False
self.PythonBuffer = UndoBuffer(cPickle.dumps(self.PythonCode), saved)
def BufferPython(self):
self.PythonBuffer.Buffering(cPickle.dumps(self.PythonCode))
def StartBuffering(self):
self.Buffering = True
def EndBuffering(self):
if self.Buffering:
self.PythonBuffer.Buffering(cPickle.dumps(self.PythonCode))
self.Buffering = False
def MarkPythonAsSaved(self):
self.EndBuffering()
self.PythonBuffer.CurrentSaved()
def PythonIsSaved(self):
return self.PythonBuffer.IsCurrentSaved() and not self.Buffering
def LoadPrevious(self):
self.EndBuffering()
self.PythonCode = cPickle.loads(self.PythonBuffer.Previous())
def LoadNext(self):
self.PythonCode = cPickle.loads(self.PythonBuffer.Next())
def GetBufferState(self):
first = self.PythonBuffer.IsFirst() and not self.Buffering
last = self.PythonBuffer.IsLast()
return not first, not last