wxglade_hmi/wxglade_hmi.py
author Laurent Bessard
Thu, 06 Dec 2012 17:14:03 +0100
changeset 896 899ca8809528
parent 834 d613696aad01
child 1014 e2f7d6c95db0
permissions -rw-r--r--
Fixed bug when copying transition and connected FBD or LD diagram. Wire between the new transition and new FBD or LD diagram was not selected.
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     1
import wx
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     2
import os, sys
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     3
from xml.dom import minidom
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     4
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
     5
from py_ext import PythonFileCTNMixin
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     6
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
     7
class WxGladeHMI(PythonFileCTNMixin):
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
     8
717
1c23952dbde1 refactoring
Edouard Tisserant
parents: 427
diff changeset
     9
    ConfNodeMethods = [
734
5c42cafaee15 Moved LPC sources to a separate project
Edouard Tisserant
parents: 728
diff changeset
    10
        {"bitmap" : "editWXGLADE",
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    11
         "name" : _("WXGLADE GUI"),
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    12
         "tooltip" : _("Edit a WxWidgets GUI with WXGlade"),
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    13
         "method" : "_editWXGLADE"},
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    14
    ]
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    15
728
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    16
    def ConfNodePath(self):
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    17
        return os.path.join(os.path.dirname(__file__))
e0424e96e3fd refactoring - library support is not anymore attached to configtree nodes, but handles by project controller
Edouard Tisserant
parents: 725
diff changeset
    18
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    19
    def _getWXGLADEpath(self):
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    20
        # define name for IEC raw code file
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    21
        return os.path.join(self.CTNPath(), "hmi.wxg")
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    22
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    23
    def launch_wxglade(self, options, wait=False):
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    24
        from wxglade import __file__ as fileName
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    25
        path = os.path.dirname(fileName)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    26
        glade = os.path.join(path, 'wxglade.py')
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    27
        if wx.Platform == '__WXMSW__':
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    28
            glade = "\"%s\""%glade
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    29
        mode = {False:os.P_NOWAIT, True:os.P_WAIT}[wait]
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    30
        os.spawnv(mode, sys.executable, ["\"%s\""%sys.executable] + [glade] + options)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    31
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    32
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
    33
    def CTNGenerate_C(self, buildpath, locations):
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    34
        """
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    35
        Return C code generated by iec2c compiler 
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    36
        when _generate_softPLC have been called
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    37
        @param locations: ignored
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    38
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    39
        """
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    40
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    41
        current_location = self.GetCurrentLocation()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    42
        # define a unique name for the generated C file
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    43
        location_str = "_".join(map(lambda x:str(x), current_location))
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    44
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    45
        runtimefile_path = os.path.join(buildpath, "runtime_%s.py"%location_str)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    46
        runtimefile = open(runtimefile_path, 'w')
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    47
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    48
        hmi_frames = {}
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    49
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    50
        wxgfile_path=self._getWXGLADEpath()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    51
        if os.path.exists(wxgfile_path):
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    52
            wxgfile = open(wxgfile_path, 'r')
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    53
            wxgtree = minidom.parse(wxgfile)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    54
            wxgfile.close()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    55
            
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    56
            for node in wxgtree.childNodes[1].childNodes:
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    57
                if node.nodeType == wxgtree.ELEMENT_NODE:
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    58
                    hmi_frames[node._attrs["name"].value] =  node._attrs["class"].value
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    59
                    
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    60
            hmipyfile_path=os.path.join(self._getBuildPath(), "hmi.py")
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    61
            if wx.Platform == '__WXMSW__':
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    62
                wxgfile_path = "\"%s\""%wxgfile_path
384
50f2069a06b3 Bug on windows when trying to open wxglade generated 'hmi.py' file fixed
laurent
parents: 367
diff changeset
    63
                wxghmipyfile_path = "\"%s\""%hmipyfile_path
50f2069a06b3 Bug on windows when trying to open wxglade generated 'hmi.py' file fixed
laurent
parents: 367
diff changeset
    64
            else:
50f2069a06b3 Bug on windows when trying to open wxglade generated 'hmi.py' file fixed
laurent
parents: 367
diff changeset
    65
                wxghmipyfile_path = hmipyfile_path
50f2069a06b3 Bug on windows when trying to open wxglade generated 'hmi.py' file fixed
laurent
parents: 367
diff changeset
    66
            self.launch_wxglade(['-o', wxghmipyfile_path, '-g', 'python', wxgfile_path], wait=True)
367
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    67
            
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    68
            hmipyfile = open(hmipyfile_path, 'r')
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    69
            runtimefile.write(hmipyfile.read())
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    70
            hmipyfile.close()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    71
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    72
        runtimefile.write(self.GetPythonCode())
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    73
        runtimefile.write("""
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    74
%(declare)s
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    75
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    76
def _runtime_%(location)s_begin():
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    77
    global %(global)s
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    78
    
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    79
    def OnCloseFrame(evt):
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    80
        wx.MessageBox(_("Please stop PLC to close"))
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    81
    
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    82
    %(init)s
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    83
    
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    84
def _runtime_%(location)s_cleanup():
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    85
    global %(global)s
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    86
    
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    87
    %(cleanup)s
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    88
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    89
""" % {"location": location_str,
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    90
       "declare": "\n".join(map(lambda x:"%s = None" % x, hmi_frames.keys())),
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    91
       "global": ",".join(hmi_frames.keys()),
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    92
       "init": "\n".join(map(lambda x: """
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    93
    %(name)s = %(class)s(None)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    94
    %(name)s.Bind(wx.EVT_CLOSE, OnCloseFrame)
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    95
    %(name)s.Show()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    96
""" % {"name": x[0], "class": x[1]},
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    97
                             hmi_frames.items())),
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    98
       "cleanup": "\n    ".join(map(lambda x:"%s.Destroy()" % x, hmi_frames.keys()))})
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
    99
        runtimefile.close()
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
   100
        
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
   101
        return [], "", False, ("runtime_%s.py"%location_str, file(runtimefile_path,"rb"))
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
   102
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
   103
    def _editWXGLADE(self):
a76ee5307bb7 Adding support for python plugin wxglade_hmi allowing creation of PLC HMI using wxglade
laurent
parents:
diff changeset
   104
        wxg_filename = self._getWXGLADEpath()
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   105
        open_wxglade = True
718
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   106
        if not self.GetCTRoot().CheckProjectPathPerm():
5d4dc150b956 refactoring
Edouard Tisserant
parents: 717
diff changeset
   107
            dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   108
                                      _("You don't have write permissions.\nOpen wxGlade anyway ?"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   109
                                      _("Open wxGlade"),
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   110
                                      wx.YES_NO|wx.ICON_QUESTION)
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   111
            open_wxglade = dialog.ShowModal() == wx.ID_YES
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   112
            dialog.Destroy()
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   113
        if open_wxglade:
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   114
            if not os.path.exists(wxg_filename):
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   115
                hmi_name = self.BaseParams.getName()
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   116
                open(wxg_filename,"w").write("""<?xml version="1.0"?>
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   117
    <application path="" name="" class="" option="0" language="python" top_window="%(name)s" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0">
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   118
        <object class="%(class)s" name="%(name)s" base="EditFrame">
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   119
            <style>wxDEFAULT_FRAME_STYLE</style>
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   120
            <title>frame_1</title>
834
d613696aad01 Adding default sizer in main frame in default wxGlade GUI file
laurent
parents: 734
diff changeset
   121
            <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
d613696aad01 Adding default sizer in main frame in default wxGlade GUI file
laurent
parents: 734
diff changeset
   122
                <orient>wxVERTICAL</orient>
d613696aad01 Adding default sizer in main frame in default wxGlade GUI file
laurent
parents: 734
diff changeset
   123
            <object class="sizerslot" />
d613696aad01 Adding default sizer in main frame in default wxGlade GUI file
laurent
parents: 734
diff changeset
   124
        </object>
427
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   125
        </object>
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   126
    </application>
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   127
    """ % {"name": hmi_name, "class": "Class_%s" % hmi_name})
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   128
            if wx.Platform == '__WXMSW__':
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   129
                wxg_filename = "\"%s\""%wxg_filename
7ac746c07ff2 Check ProjectPath write permission
greg
parents: 384
diff changeset
   130
            self.launch_wxglade([wxg_filename])