author | Laurent Bessard |
Tue, 05 Mar 2013 17:54:19 +0100 | |
changeset 961 | 069466072e9d |
parent 834 | d613696aad01 |
child 1014 | e2f7d6c95db0 |
permissions | -rw-r--r-- |
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 | 9 |
ConfNodeMethods = [ |
734 | 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 | 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 | 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 | 105 |
open_wxglade = True |
718 | 106 |
if not self.GetCTRoot().CheckProjectPathPerm(): |
107 |
dialog = wx.MessageDialog(self.GetCTRoot().AppFrame, |
|
427 | 108 |
_("You don't have write permissions.\nOpen wxGlade anyway ?"), |
109 |
_("Open wxGlade"), |
|
110 |
wx.YES_NO|wx.ICON_QUESTION) |
|
111 |
open_wxglade = dialog.ShowModal() == wx.ID_YES |
|
112 |
dialog.Destroy() |
|
113 |
if open_wxglade: |
|
114 |
if not os.path.exists(wxg_filename): |
|
115 |
hmi_name = self.BaseParams.getName() |
|
116 |
open(wxg_filename,"w").write("""<?xml version="1.0"?> |
|
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"> |
|
118 |
<object class="%(class)s" name="%(name)s" base="EditFrame"> |
|
119 |
<style>wxDEFAULT_FRAME_STYLE</style> |
|
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 | 125 |
</object> |
126 |
</application> |
|
127 |
""" % {"name": hmi_name, "class": "Class_%s" % hmi_name}) |
|
128 |
if wx.Platform == '__WXMSW__': |
|
129 |
wxg_filename = "\"%s\""%wxg_filename |
|
130 |
self.launch_wxglade([wxg_filename]) |