py_ext/PythonFileCTNMixin.py
author Laurent Bessard
Fri, 10 May 2013 11:49:22 +0200
changeset 1115 a4e58715ae41
parent 1113 16e5b6abd91c
child 1118 2c96a2f36295
permissions -rw-r--r--
Fixed bug in CodeFileEditor allowing to remove NEWLINE character between section header and section code
import os
from PLCControler import UndoBuffer
from PythonEditor import PythonEditor

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

from CodeFileTreeNode import CodeFile

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

class PythonFileCTNMixin(CodeFile):
    
    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 GetPythonCode(self):
        current_location = self.GetCurrentLocation()
        # define a unique name for the generated C file
        location_str = "_".join(map(str, current_location))
        
        text = "## Code generated by Beremiz python mixin confnode\n\n"
        
        # Adding includes
        text += "## User includes\n"
        text += self.CodeFile.includes.gettext()
        text += "\n"
        
        # Adding variables
        text += "## User variables reference\n"
        config = self.GetCTRoot().GetProjectConfigNames()[0]
        for variable in self.CodeFile.variables.variable:
            global_name = "%s_%s" % (config.upper(), variable.getname().upper())
            text += "# global_var:%s python_var:%s type:%s initial:%s\n" % (
                global_name,
                variable.getname(),
                variable.gettype(),
                str(variable.getinitial()))
        text += "\n"
        
        # Adding user global variables and routines
        text += "## User internal user variables and routines\n"
        text += self.CodeFile.globals.gettext()
        text += "\n"
        
        # Adding Beremiz confnode functions
        text += "## Beremiz confnode functions\n"
        for func, args, return_code, code_object in [
            ("__init_", "*args, **kwargs", 
             "return 0", self.CodeFile.initFunction),
            ("__cleanup_", "", "", self.CodeFile.cleanUpFunction),
            ("__retrieve_", "", "", self.CodeFile.retrieveFunction),
            ("__publish_", "", "", self.CodeFile.publishFunction),]:
            text += "def %s%s(%s):\n" % (func, location_str, args)
            lines = code_object.gettext().strip().splitlines()
            if len(lines) > 0 or return_code != "":
                for line in lines:
                    text += "    " + line + "\n"
                text += "    " + return_code + "\n\n"
            else:
                text += "    pass\n\n"
        
        return text