py_ext/PythonFileCTNMixin.py
author Laurent Bessard
Sun, 12 May 2013 23:30:00 +0200
changeset 1122 84de51ab40d2
parent 1120 35d772ec1a76
child 1124 b1705000eba1
permissions -rw-r--r--
Adding support for using current selected variable for generate newly added variable informations in VariablePanel
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().strip()
        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().strip()
        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"
                if return_code != "":
                    text += "    " + return_code + "\n"
                text += "\n"
            else:
                text += "    pass\n\n"
        
        return text