py_ext/PythonFileCTNMixin.py
author Laurent Bessard
Mon, 13 May 2013 23:08:47 +0200
changeset 1128 86527a6f06fb
parent 1124 b1705000eba1
child 1132 28f96aa9c070
permissions -rw-r--r--
Removed restriction on POU interface variables modification when POU is already used
import os
from PLCControler import UndoBuffer
from PythonEditor import PythonEditor

from xml.dom import minidom
from xmlclass import GenerateClassesFromXSD
import cPickle

from CodeFileTreeNode import CodeFile

PythonClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "py_ext_xsd.xsd")) 

class PythonFileCTNMixin(CodeFile):
    
    CODEFILE_NAME = "PyFile"
    SECTIONS_NAMES = [
        "globals",
        "init",
        "cleanup",
        "start",
        "stop"]
    EditorType = PythonEditor
    
    def __init__(self):
        CodeFile.__init__(self)
        
        filepath = self.PythonFileName()
        
        python_code = 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":
                    python_code.loadXMLTree(child, ["xmlns", "xmlns:xsi", "xsi:schemaLocation"])
                    self.CodeFile.globals.settext(python_code.gettext())
                    os.remove(filepath)
                    self.CreateCodeFileBuffer(False)
                    self.OnCTNSave()
    
    def CodeFileName(self):
        return os.path.join(self.CTNPath(), "pyfile.xml")
    
    def PythonFileName(self):
        return os.path.join(self.CTNPath(), "py_ext.xml")

    def GetSectionsCode(self):
        
        # Generate Beremiz python runtime variables code
        config = self.GetCTRoot().GetProjectConfigNames()[0]
        variables_str = ""
        for variable in self.CodeFile.variables.variable:
            global_name = "%s_%s" % (config.upper(), variable.getname().upper())
            variables_str += "# global_var:%s python_var:%s type:%s initial:%s\n" % (
                global_name,
                variable.getname(),
                variable.gettype(),
                str(variable.getinitial()))
        
        sections_code = {
            "variables": variables_str,
            "globals": self.CodeFile.globals.gettext().strip()
        }
        
        # Generate Beremiz python runtime functions code
        for section in self.SECTIONS_NAMES:
            if section != "globals":
                code_object = getattr(self.CodeFile, section)
                section_str = ""
                lines = code_object.gettext().strip().splitlines()
                if len(lines) > 0:
                    for line in lines:
                        section_str += "    " + line + "\n"
                    section_str += "\n"
                sections_code[section] = section_str
            
        return sections_code